2016-07-19 9 views

Antwort

2

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.

+0

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

+0

@ 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. –

0

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?

+0

ein Problem ist, wenn Sie einen Vektor ändern, können Sie ungültige Iterator halten – SHR

+0

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.) –

+0

Fwiw. Der Debug-Modus von libstdC++ meldet sich. (Zu Recht.) Http://coliru.stacked-crooked.com/a/36d6c1107be7b54f –