2017-02-05 7 views
-5

ich ein Paar haben, das 2 Iteratoren hat also:Wie in den Beginn eines Iterators in einem Paar für den Zugriff auf C++

auto trim = make_pair <std::string::iterator, std::string::iterator> 

und ich versuche, den Anfang des ersten Iterator mit Ende des vergleichen 2. Iterator.

Ich kam mit dieser Codezeile, aber es ist nicht richtig, weil das Programm nicht kompilieren:

if (begin(trim).first == end(trim).second) 

Ich habe auch versucht, diese Codezeile, aber es zeigt immer noch Fehler

if (begin(get<0>(trim)) == end(get<1>(trim))) 

Der Fehler:

error: no matching function for call to ‘begin(std::pair<__gnu_cxx::__normal_iterator >, __gnu_cxx::__normal_iterator > >&)’

if (begin(trim).first == end(trim).second)

 ^

Komplettes Beispiel:

auto func(std::string& str, TrimPredicate p) -> 
std::pair< 
std::string::iterator, // typedef to string iterator type 
std::string::iterator // typedef to string iterator type 
> 
{ 
// Do stuff and return them as below 
return std::make_pair(first_non_ws_iter, last_non_ws_iter); 

} 

auto func2()-> std::pair<bool, string> { 

auto trimmed_range = func(
             line, 
             [loc](auto char_var) 
             { 
             return isspace(char_var, loc); 
             } 
             ); 


    if (begin(trimmed_range).first == end(trimmed_range).second) 
      //do something 
+2

Iteratoren haben nicht beginnt und endet. –

+0

Kannst du ein wenig mehr darüber erzählen, warum du das machst, vielleicht mit einem kurzen vollständigen Beispiel? Kinda fühlt sich an wie ein XY-Problem. –

+0

@NeilButterworth Es tut mir leid, neu in C++ hier, aber der Prof hat uns gebeten, diese Codezeile zu schreiben: 'Wenn der Trim" begin "(erster) Iterator ist gleich Trim" Ende "(zweiter) Iterator, dann loop (ie, weiter) .' So bin ich jetzt wirklich verwirrt – Suhaib

Antwort

2

Iteratoren arbeiten paarweise zur Angabe von Bereichen. Eine Reihe hat einen Anfang und ein Ende. Container sind eine der gebräuchlichsten Methoden zum Erstellen von Bereichen. Container haben Elementfunktionen mit den Namen begin() und end(), die Iteratoren zurückgeben, die auf den Anfang bzw. das Ende des Inhalts des Containers zeigen. Die C++ - Standardbibliothek bietet außerdem die freien Funktionen std::begin und std::end, die auf Container und Arrays angewendet werden können, um die Start- und Ende-Iteratoren zu erhalten. wobei der Anfang des Bereiches und das zweite Element

Der Kommentar schlägt der Professor Formulierung zu erwähnen, dass der Professor eine convention bewirbt, der ein std::pair<T,T> wo T ist ein Iterator-Typ einen Bereich, mit dem ersten Element des Paars bezeichnet das Ende sein. Das ist in Ordnung, aber es hat keine inhärente Verbindung zu den Funktionen begin und end.

So ist die Art und Weise, die beginnen und enden Iteratoren von diesem Paar zu bekommen, ist einfach die Elemente des Paares zuzugreifen:

if (trimmed_range.first == trimmed_range.second) 
    // do something 
Verwandte Themen