サンプルの動作確認バージョン [GCC4.4/1.41.0] [VC9/1.41.0]
#include <list>
#include <boost/utility.hpp>
using namespace std;
int main()
{
list<int> lst( 2 );
*lst.begin() = 10;
*boost::next( lst.begin() ) = 20;
return 0;
}
リストの先頭は 10、先頭の次の要素は 20 になります。
iterator
を渡すと、「その次の要素」を返してくれる関数なわけです。
boost::prior
ならば逆に「その前の要素」を返します。
これがあると、例えば
list<int>::iterator it = lst.begin();
for_each( ++it, lst.end(), f );
などと書いていた作業が一行で書けるようになってちょっと嬉しい感じです。
next
の代わりに (++lst.begin())
と書けば良いではないか?と思われるかもしれませんが、begin()
の返すイテレータが例えば int*
などの組込型であった場合、
残念ながらその記述はコンパイルエラーになってしまいます。そして実際、
特に vector<T>
は幾つかの実装でイテレータとして
T*
を返してきます。