std::list
C++のクラスについて気になる点があることに気付きました。簡単に言えば、リストのイテレータが機能する方法に関するものです。次のコードを検討してください。
std::list<int> alist;
alist.push_back(0);
alist.push_back(1);
alist.push_back(2);
明らかに、これは 3 つの整数要素を含むリストを作成します。リストの先頭に反復子を定義し、それを使用して、次のように最初の要素に含まれる値を出力できます。
std::list<int>::iterator iter = alist.begin();
std::cout << *iter << std::endl; // Prints "0" to stdout
少し奇妙だと思うのは、イテレータをデクリメントすると、「ループアラウンド」し、リストの最後の要素を指すことになります。
--iter;
std::cout << *iter << std::endl; // Prints "2" to stdout
二重にリンクされたリストとして実装されていると思われるものに対して、これは合理的な動作ですか? リストが循環的にリンクされたリストである場合、イテレータから同様の動作が予想されますが、これは非常に奇妙です。
過去に使用したこの反復子の動作の実用的な用途はありますか? この動作に関連して注意すべき問題はありますか?
(ちなみに、これは gcc 4.7.0 (MinGW) で発生します。他のバージョンやコンパイラではテストしていません。)