reverse_iterator in iterator umwandeln
-
Hi,
lassen sich
std::list::reverse_iterator
en instd::list::iterator
en umwandeln?ich brauche das ganze für std::list::splice, hätte aber gerne r-iteratoren verwendet
-
Vielleicht so was?
#include <iostream> #include <list> int main(int argc, char** argv) { std::list<int> testlist; for (int i = 0; i < 5; i++) { testlist.push_back(i); } std::list<int>::iterator iter = testlist.begin(); for (std::list<int>::reverse_iterator riter = testlist.rbegin(); riter != testlist.rend(); riter++) { std::cout << *riter; if (*riter == 2) { std::cout << " (remind)"; iter = --riter.base(); } std::cout << "\n"; } std::cout << "\nreminded: " << *iter << std::endl; return 0; }
Mit
reverse_iterator::base()
kann man an den zugrunde liegendeniterator
herankommen. Damitrbegin()
undrend()
analog zubegin()
undend()
verwendet werden können, hält sich derreverse_iterator
intern einen herkömmlicheniterator
. Für diesen giltrbegin() == end()
undrend() == begin()
. Weilrbegin()
dann aber nicht dereferenziert werden dürfte, sorgen die Dereferenzierungs-Operatoren*
und->
dafür, dass der interneiterator
vorher stets um eins in Richtungbegin()
gerückt wird, was dannend() - 1
entspräche. Bei der Verwendung vonreverse_iterator::base()
muss dieser Zusammenhang mittels vorherigem Dekrement berücksichtigt werden, damit nicht der interneiterator
, sondern das tatsächliche Äquivalent desreverse_iterator
s zur Anwendung kommt.