reverse_iterator in iterator umwandeln
-
Hi,
lassen sich
std::list::reverse_iteratoren instd::list::iteratoren 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 liegendeniteratorherankommen. Damitrbegin()undrend()analog zubegin()undend()verwendet werden können, hält sich derreverse_iteratorintern 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 interneiteratorvorher stets um eins in Richtungbegin()gerückt wird, was dannend() - 1entsprä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_iterators zur Anwendung kommt.