Angenommen, ich habe drei Vektoren A, B und C vom gleichen Typ, und ich habe einen Iterator für den Vektor-Container, wie finde ich heraus, zu welchem Container gehört? DankeGibt es eine Möglichkeit, einen Iterator seinem Container zuzuordnen?
Antwort
Sie können nicht. Ihr Design ist kaputt, überdenken Sie es.
Der ganze Sinn von Iteratoren besteht darin, weg von Containern (und anderen Datensammlungen) zu abstrahieren, Sie können nicht einfach die Abstraktion umkehren.
Ihre Frage Strictly beantworten, können Sie wie folgt überprüfen:
vector<T>::iterator it = ...;
if (it >= A.begin() && it < A.end()) // it is in vector A
if (it >= B.begin() && it < B.end()) // or in vector B
if (it >= C.begin() && it < C.end()) // and here in vector C
Dies funktioniert nur, weil vector
einen Direktzugriffs Iterator verwendet, und wird für viele andere Behälter wie map
und list
nicht halten. Wie @Baum mit Augen sagt, solltest du dies neu gestalten. Vielleicht sollten Sie einen Verweis auf den gewünschten Vektor zusammen mit dem Iterator übergeben?
ein Problem ist, wenn Sie einen Vektor ändern, können Sie ungültige Iterator halten – SHR
Das unmittelbare Problem ist, dass der Vergleich von Iteratoren aus verschiedenen Containern Undefined Behavior. Das ist also nicht wirklich legal. (Wird wahrscheinlich arbeiten, aber nie versucht.) –
Fwiw. Der Debug-Modus von libstdC++ meldet sich. (Zu Recht.) Http://coliru.stacked-crooked.com/a/36d6c1107be7b54f –
Ich verstehe (natürlich nach dem Testen in einem Code) das war eine schlechte Design-Wahl. Was mich neugierig machte, war, dass der Debugger in der Lage war, Iteratoren aus verschiedenen Vektorcontainern zu erkennen, die verglichen wurden, und ließ mich glauben, dass es eine Möglichkeit gibt, den Iterator dem Container zuzuordnen. Ich wollte nur wissen, ob jemand anderes solche Techniken kennt. Danke! – user6386155
@ user6386155 Eine Implementierung/Debugger/wir. Es ist natürlich erlaubt zu verfolgen, zu welchem Bereich ein Iterator gehört, aber im Allgemeinen ist es eine Einbahnstraße. –