2016-06-05 6 views
-1
vector<int> a = { 1,2,3,4,5,6,7 }; 
pair<vector<int>, vector<int>::iterator> pair_of_itr; //not working showing wrong directional error! 
auto pair_of_itr = minmax_element(a.begin(), a.end()); 
cout << *pair_of_itr.first << " " << *pair_of_itr.second << endl; // working with auto but not with the PAIR of iterator. 
//cout << pair_of_itr->first << " " << pair_of_itr->second << endl // not working 
return 0; 

Hier habe ich über Kommentare erklärt. Bitte verweise auf Kommentare.Was ist der Unterschied zwischen * iter.first und iter-> first?

+0

Haben Sie sich den Typ von ['minmax_element'] angesehen (http://en.cppreference.com/w/cpp/algorithm/minmax_element)? – molbdnilo

Antwort

1

a->b ist das gleiche wie (*a).b. *a.b ist das gleiche wie *(a.b). Sie unterscheiden sich also darin, ob a dereferenziert wird oder a.b dereferenziert wird.

In Ihrem Fall erstellt auto pair_of_itr = std::minmax_element ... einen std::pair Iterator, und es ist der Iterator, den Sie dereferenzieren möchten. Das wäre also *pair_of_itr.first. *pair_of_itr ist schlecht gebildet, weil ein std::pair nicht selbst ein Zeiger oder Iterator ist. Das Problem mit pair<vector<int>, vector<int>::iterator> pair_of_itr; ist einfach, dass das erste Element des Paares ein std::vector ist, kein std::vector::iterator. In diesem Fall kann weder pair_of_itr noch pair_of_itr.first dereferenziert werden. *pair_of_itr.second würde kompilieren, weil das zweite Element ein Iterator ist.

Es ist in der Regel eine gute Idee, überflüssige Klammern hinzuzufügen, besonders wenn Sie fragen müssen, ob sie notwendig sind. Andere Leute könnten sich auch nicht daran erinnern, dass *a.b*(a.b) bedeutet, und die Klammern kosten nicht viel.

+0

Paar , Vektor :: Iterator> pair_of_itr; Dies sind nicht zwei Iteratoren, sondern ein Vektor und ein Iterator. –

+0

@marshall: Ja, wie ich schon sagte: "Das erste Element des Paares ist ein std :: vector, kein std :: vector :: iterator." War das nicht eine klare Aussage? – rici

+0

Nein, es war klar; Ich habe es gerade im zweiten Para verpasst; Es tut uns leid. –

Verwandte Themen