Manchmal möchte ich den Iterator verwenden, der von einer Funktion aus der Algorithmusbibliothek zurückgegeben wird. Das Problem, dem ich gegenüberstehe, tritt auf, wenn ich zwischen einer modifizierenden Funktion und einer nicht modifizierenden Funktion gehe. Ursache in der nicht-modifizierenden Funktion möchte ich eine const_iterator
verwenden. Als Spielzeug Beispiel:Gibt es einen make_const_iterator?
vector<int> v = { 1, 8, 7, 4, 3, 6, 2, 5 };
auto it = partition(begin(v), end(v), bind(greater<int>(), placeholders::_1, 3));
cout << (find(cbegin(v), it, 13) != cend(v)) << endl;
Wenn ich versuche, diesen Code zu kompilieren, erhalte ich die Fehlermeldung:
no matching function for call to
find(std::vector<int>::const_iterator, __gnu_cxx::__normal_iterator<int*, std::vector<int> >&, int)
Das Problem, das ich in laufenden bin ist der einzige Konvertierungsprozess I ist möglicherweise teuer finden: auto cit = next(cbegin(v), distance(begin(v), it))
Gibt es eine Möglichkeit, dass dies funktioniert? Oder bin ich fest, umwandeln oder einfach nicht verwenden const_iterator
s?
Nur ein preemptives Kommentar, ich weiß, dass ich nur 'find' direkt auf' v' nutzen könnte. Ich suche keinen besseren Weg, um mein Spielzeugbeispiel zu schreiben. Ich suche nach einer Lösung für das Problem, die es veranschaulicht. –
Haben Sie versucht, nur einen Const_iterator aus dem normalen zu konstruieren? – rubenvb
Sollen wir annehmen, dass der Typ des ursprünglichen Containers unbekannt ist? Wenn nicht, macht 'decltype (v) :: const_iterator (it)' den Trick. Die Verwendung von 'cvegin (v)' in Ihrer vorgeschlagenen Lösung scheint zu implizieren, dass Sie Zugriff auf 'v' haben und nicht nur auf den Iterator. –