2

重複の可能性:
std::list の push_back が、rbegin で初期化された逆反復子を変更するのはなぜですか?

次のようなコードを取得しました。

#include <iostream>
#include <list>

int main(){
    std::list<int> l;
    l.push_back(1);
    l.push_back(2);
    std::list<int>::iterator it = l.begin();
    std::cout << *it << std::endl; // 1
    l.push_front(0);
    std::cout << *it << std::endl; // 1
    std::list<int>::reverse_iterator rit = l.rbegin();
    std::cout << *rit << std::endl; // 2
    l.push_back(3);
    std::cout << *rit << std::endl; // 3
}

出力:

1
1
2
3

フォワード iterator を定義した後it、 を呼び出しpush_front()ても、の位置はit変わらないようです。しかし、reverse_iterator を定義した後でritを呼び出すと、 WILLpush_back()の位置が変わります。rit

これは矛盾と考えるべきでしょうか?片方が動き、もう片方が同じままというのは、私にはまったく意味がありません。

前もって感謝します。:)

4

1 に答える 1

-1

std::listイテレータを無効にしません。通常のイテレータでわかるように、上のイテレータはstd::list、リストが変更された後でも同じ要素を指します。

一方、逆イテレータはとして実装されます。これは、 C ++ STLのドキュメントstd::reverse_iterator<iterator>によると、イテレータによって返される要素(この場合はリストの最後)のにある要素を指すイテレータを維持します。

于 2012-09-22T06:59:23.020 に答える