49

リストを反復処理するためのとがstd::list<int> lstいくつかあるとします。そして、私が使用したい、または私のコードstd::list<int>::iterator itの値に依存します。(stlドキュメントでそのようなものを見つけることができませんでした)のようにそれを行うためのいくつかの良い方法はありますか?または、毎回コピーしてコピーをインクリメント(デクリメント)する必要がありますか?itit + 1it - 1next()prev()it

4

3 に答える 3

50

はい、C ++ 11以降、探しているメソッドは2つstd::prevありstd::nextます。それらはイテレータライブラリにあります。

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
于 2012-04-13T08:04:32.517 に答える
20

コピーおよびコピーのインクリメント/デクリメントは、それを実行できる唯一の方法です。

ラッパー関数を記述して非表示にすることができます(回答に記載されているように、C++11にはstd::prev / std :: nextがあり、これはまさにそれを実行します(Boostは同様の関数を定義します)。 「インクリメント」操作なので、「間違った」操作をしていることを心配する必要はありません。

于 2012-04-13T08:37:58.617 に答える
6

単純な事前に用意されたソリューションはprior、およびnextからBoost.utilityです。それらは利用しますが、一時的なものを作成する必要はoperator--ありoperator++ません。

于 2012-04-13T08:03:32.580 に答える