1

以下のようなリストがあります

typedef std::list<std::string> SegmentValue;

次に、反復で、これが最後の反復かどうかを確認する必要があります。

     for(Field::SegmentValue::const_iterator it = m_segmentValue.begin();It != 
           m_segmentValue.end();It++){
              if((segIt + 1) == m_segmentValue.end())//last iteration
              ...
        }

しかし、コンパイルでエラーが発生します:

 error C2678: binary '+' : no operator found which takes a left-hand operand of type 'std::list<_Ty>::_Const_iterator<_Secure_validation>'

これが最後のイテレーションかどうかを確認するにはどうすればよいですか?

4

6 に答える 6

4

+バイナリと-演算子をstd::list反復子と共に使用することはできません。std::listイテレータは双方向イテレータですが、ランダム アクセスイテレータではありません。つまり、任意の定数値でシフトすることはできません。

代わりに単項++を使用してください--

Field::SegmentValue::const_iterator it_last = m_segmentValue.end();
--it_last;

現在it_lastは最後の要素イテレータです。有効なままであることを確認してください。コンテナーに対してイテレーターを無効にする変更を行っていない場合は、それを事前に計算it_lastしてサイクルで使用できます。それ以外の場合は、必要に応じて再計算する必要があります。

実際、一般的なアルゴリズムでは、アルゴリズムの要件を軽減するため、(バイナリの and ではなく)イテレータとともにand を使用--することを常にお勧めます+++ 1- 1+-++--

于 2012-07-09T14:56:56.617 に答える
2

使用std::next:

if (std::next(segIt) == m_segmentValue.end()) ...

C++03 を使用している場合は、次のように簡単に記述できnextます。

template<typename T> T next(T it, typename std::iterator_traits<T>::difference_type n = 1) {
    std::advance(it, n);
    return it;
}
于 2012-07-09T14:58:37.753 に答える
1

おそらくこのようなもの:

Field::SegmentValue::const_iterator last = m_segmentValue.end()
--last;

for(Field::SegmentValue::const_iterator it = m_segmentValue.begin();
    It != m_segmentValue.end();
    It++) {

        if(It == last) {
            // last iteration
        }     
    }

ランダム アクセス イテレータでのみ演算を実行できます。std::listのイテレータは双方向です。

さまざまなカテゴリのイテレータでできることとできないことについては、こちらを参照してください。

于 2012-07-09T14:58:43.803 に答える
0

どうですか:

if ( &*it == &*(m_segmentValue.rbegin()))

つまり、セグメントのアドレスを比較します。

于 2012-07-12T15:07:34.490 に答える
0

std::list イテレータはランダム アクセスではなく、双方向です。operator+ はサポートされていません。そのようなことを行うには、 std::vector を使用する必要があります。

于 2012-07-09T14:58:31.830 に答える
0

これを試して:

Field::SegmentValue::const_iterator next = it; ++next;
// or in C++11:
// Field::SegmentValue::const_iterator next = std::next( it );
if( next == m_segmentValue.end()) //last iteration

リスト反復子はBidirectionalではないRandomAccessため、サポートしていませんoperator+

于 2012-07-09T14:57:21.900 に答える