Problem beim iterieren ueber einen Container
-
for (set<string>::iterator it = list.begin(); it != list.end(); ++it) { cout << *it; }
Dieser Code loopt mindestens einmal, auch wenn der Container leer ist. Dadurch wird der Iterator dereferenziert, der ins nichts zeigt. Ist das ein Problem mit meiner STL, da man aehnlichen Code sehr haeufig sieht, oder ist das richtig so und diverse Codebeispiele sind schlicht falsch?
-
std::list<std::string>::iterator start = list.begin(), end = list.end(); while(start != end){ std::cout << *start << std::endl; ++start; }
-
Das macht keinen Unterschied, ein direkter Vergleich if (list.begin() == list.end()) cout << "true"; ergibt, das list.begin() nicht gleich list.end() ist, wenn der Container leer ist. Erst nachdem man den Iterator inkrementiert hat, ist it == list.end().
-
Und woraus folgerst du, dass der Container leer ist? Was gibt size() zurück?
-
könnte es sein, dass begin() auf den zero-terminator verweist und damit erst nach dem inkrementieren ausserhalb des gültigen speicherbereichs, also >= end() ist?
ansonsten nimm das beispiel von whilebevorzuger und füge ein --end; vor dem loop ein...
unschön aber sollte klappen...
vorausgesetzt du hast dich nicht vertan und der fehler (ich nehme an das prog stürzt ab?) liegt ganz woandersmfg
-
Der Standard garantiert, dass foo.begin() == foo.end(), wenn foo.size() == 0, sofern foo die Instanz eines Objektes ist, dass das Container-Konzept erfüllt, und zwar in Abschnitt 23.1.7:
7 begin() returns an iterator referring to the first element in the con-
tainer. end() returns an iterator which is the past-the-end value for
the container. If the container is empty, then begin() == end();Der Code ist richtig, deine STL ist scheinbar kaputt.
-
Ich ratet einfach mal: du hast VC++ 6