如何检查这是否是std :: list的最后一个成员?

时间:2012-07-09 14:53:59

标签: c++ stl

我有一个如下所示的列表

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>'

我如何检查这是否是最后一次?

6 个答案:

答案 0 :(得分:4)

您不能将+-运算符与std::list迭代器一起使用。 std::list迭代器是双向迭代器,但它们不是随机访问迭代器,这意味着您不能将它们移动任意常量值。

使用一元++--代替

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

现在it_last是迭代器的最后一个元素。只要确保它仍然有效。如果您没有对容器进行任何迭代器无效的修改,则可以预先计算it_last并在循环中使用它。否则,您必须根据需要重新计算它。

事实上,在通用算法中,最好尽可能使用--++和迭代器(而不是二进制+ 1- 1),因为它降低了算法的要求:二进制+-需要随机访问迭代器,而++--使用双向< / em> ones。

答案 1 :(得分: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;
}

答案 2 :(得分: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的迭代器是双向的。

请参阅here了解各种类别的迭代器可以做什么和不能做什么。

答案 3 :(得分: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+

答案 4 :(得分:0)

std :: list iterator不是随机访问,它们是双向的。不支持operator +。你需要使用std :: vector来做类似的事情。

答案 5 :(得分:0)

怎么样:

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

,即比较段的地址。