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++迭代器(而不是二进制+ 1and - 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

试试这个:

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 回答
0

std::list 迭代器不是随机访问,它们是双向的。不支持 operator+。你需要使用 std::vector 来做这样的事情。

于 2012-07-09T14:58:31.830 回答
0

怎么样:

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

即,比较段的地址。

于 2012-07-12T15:07:34.490 回答