reverse_iterator in iterator umwandeln



  • Hi,

    lassen sich std::list::reverse_iterator en in std::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 liegenden iterator herankommen. Damit rbegin() und rend() analog zu begin() und end() verwendet werden können, hält sich der reverse_iterator intern einen herkömmlichen iterator . Für diesen gilt rbegin() == end() und rend() == begin() . Weil rbegin() dann aber nicht dereferenziert werden dürfte, sorgen die Dereferenzierungs-Operatoren * und -> dafür, dass der interne iterator vorher stets um eins in Richtung begin() gerückt wird, was dann end() - 1 entspräche. Bei der Verwendung von reverse_iterator::base() muss dieser Zusammenhang mittels vorherigem Dekrement berücksichtigt werden, damit nicht der interne iterator , sondern das tatsächliche Äquivalent des reverse_iterator s zur Anwendung kommt.


Log in to reply