リストを反復処理するために_std::list<int> lst
_といくつかの_std::list<int>::iterator it
_があるとします。そして、it
の値に依存して、コードで_it + 1
_または_it - 1
_を使用したい。 next()
、prev()
(stlドキュメントでそのようなことを見つけることができませんでした)のようなそれを行ういくつかの良い方法はありますか?または、it
を毎回コピーして、コピーをインクリメント(デクリメント)する必要がありますか?
コピーとコピーのインクリメント/デクリメントが唯一の方法です。
それを隠すラッパー関数を書くことができます(そして回答で述べたように、C++ 11にはそれを行うstd :: prev/std :: nextがあります(そしてBoostは同様の関数を定義します)。しかし、それらはこの「コピーとインクリメント」操作なので、「間違っている」ことを心配する必要はありません。
はい、C++ 11以降、std::prev
とstd::next
という2つのメソッドがあります。これらはイテレータライブラリで見つけることができます。
Cppreference.comの例
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::list<int> v{ 3, 1, 4 };
auto it = v.begin();
auto nx = std::next(it, 2);
std::cout << *it << ' ' << *nx << '\n';
}
出力:
3 4
あらかじめ用意されている簡単なソリューションは、 Boost.utility
からのprior
とnext
です。 operator--
とoperator++
を利用しますが、一時的なものを作成する必要はありません。