4

私の問題は次のとおりです。イテレータを使用し、各要素を次の要素と比較したいと考えています。プロトタイプは以下のようになります。比較できるようにイテレータを増やすにはどうすればよいですか? また、これが発生するための適切な条件を設定するにはどうすればよいですか? end() 関数のように、最後の要素の次の要素ではなく、最後の要素を指す方法を意味します。

std::vector<T>::const_iterator it;
std::vector<T>::const_iterator it2;
for (it = set.begin(), it != set.end(); it++)
{
  // some things happen
  if ( final == it )
  {
     if ( it != set.end()-1 ) // how to write properly condition?
     {
        it2 = it + 1; //how to assign the next here?
        if (...)//some condition
        {
          if ( it->func1() - it2->func1()) < 20 ) //actual comparison of two consecutive element values
            // do something
        }
      }
   }
}
4

5 に答える 5

5

C++11では、関数std::next()およびstd::prev()を使用します。

コードは次のようになります。

// before
it != std::set.end()-1

// after
it != std::prev(set.end())

// before
it2 = it + 1;

// after
it2 = std::next(it);

これは、マップ、セットなどの非ベクター コンテナーにも当てはまります。

注: の後std::next(it)、「それ」イテレータは変更されません!

注 2:it2 = std::next(it,n);必要なだけインクリメントするために使用します。

于 2016-01-27T11:11:51.637 に答える
2

これを解決するには、 anjoist_findを使用できます。その関数の2番目の形式(述語付き)を使用して、述語に渡す必要がありsome things happenますsome condition

auto found = std::adjacent_find( set.begin(), set.end(),
    [some_comdition]( const T & left, const T & right ) {
        if ( some_comdition ) {
            if ( left.func1() - right.func1() < 20 ) {
                do_smth();
                // return true; if there's no need to continue
            }
        }
        return false;
    }
);
于 2013-02-12T12:58:11.747 に答える
1

許容できるという事実に基づいて、 というit++名前の新しいイテレータを定義する必要があります。itplusoneこれは として初期化されitplusone = ++itます。このようにして、 の次の項目を指す反復子の意味を安全に使用できますit。また明らかに、itplusoneterms によって囲まれた反復子の範囲itplusone != set.end()。このメソッドを使用して、リスト オブジェクトとして定義されているパスの総重みを計算します。

于 2014-10-04T09:22:08.027 に答える
-1

forループでは、これを使用します。これは、完全に問題ないことit++を意味します。it = it + 1だからこれも大丈夫it2 = it + 1です。it2次の値を指します。

再びforループで、を使用しますit != set.end()。これも完全に問題ありません。したがってit + 1 < set.end()、コードで行ったのと同じように、行うこともできます。

私はあなたのコードに何も悪いことは見ていません、ただ説明したかっただけです。

于 2013-02-12T12:55:19.337 に答える