den Code unten geben (sagen, es deque.cpp
benannt ist)Singular Iterator Fehler Got mit Iterator in Looping und pop_back
#include <cstdio>
#include <deque>
int main()
{
std::deque<int> d = {1, 2, 3};
for (auto it = d.rbegin(); it != d.rend();) {
printf("it: %d\n", *it);
++it;
d.pop_back();
}
return 0;
}
Compile mit g++ -std=c++11 -o deque deque.cpp
, läuft es gut:
$ ./deque
it: 3
it: 2
it: 1
Aber wenn kompilieren mit -D_GLIBCXX_DEBUG
(g++ -std=c++11 -o deque_debug deque.cpp -D_GLIBCXX_DEBUG
, es wird unter Fehler:
$ ./deque_debug
it: 3
/usr/include/c++/4.8/debug/safe_iterator.h:171:error: attempt to copy-
construct an iterator from a singular iterator.
...
Es sieht so aus, als ob die zweite Schleife ++it
aus einem singulären Iterator konstruiert wird. Aber ich denke, nach der ++it
der ersten Schleife, zeigt der Iterator auf 2, und pop_back()
sollte es nicht ungültig machen. Warum tritt der Fehler dann auf?
Hinweis: Ich weiß, dass der Code wie unten neu schreiben könnte:
while (!d.empty()) {
auto it = d.rbegin();
printf("it: %d\n", *it);
d.pop_back();
}
Und der Fehler verschwunden sein.
Aber ich möchte wissen, was genau passiert auf den Fehlercode. (Bedeutet es, die umgekehrte Iterator Dosis nicht tatsächlich mit dem Knotenpunkt erwarte ich, aber das man danach?)
Update: @ Barry Antwort beschlossen, die Frage. Bitte lassen Sie mir eine zusätzliche relevante Frage gestellt: den Code
for (auto it = d.rbegin(); it != d.rend();) {
printf("it: %d\n", *it);
d.pop_back();
++it; // <== moved below pop_back()
}
erwartet wird, falsch zu sein, wo ++it
auf einem für ungültig erklärt Iterator in Betrieb sein sollte. Aber warum verursacht der Code keinen Fehler?
* Bedeutet es, die umgekehrte Iterator Dosis nicht wirklich zeigen auf den Knoten erwarte ich, aber der eine nach ihm * Ja? ! –