web-dev-qa-db-ja.com

反復子をインクリメント(デクリメント)せずにstd :: listの次の(前の)要素を取得する方法は?

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

45

コピーとコピーのインクリメント/デクリメントが唯一の方法です。

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

20
jalf

はい、C++ 11以降、std::prevstd::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
47
inf

あらかじめ用意されている簡単なソリューションは、 Boost.utility からのpriornextです。 operator--operator++を利用しますが、一時的なものを作成する必要はありません。

6