我有一个如下所示的列表
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>'
我如何检查这是否是最后一次?
答案 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()))
,即比较段的地址。