如何检查这是否是std :: list的最后一个成员?
问题描述:
我有一个像下面如何检查这是否是std :: list的最后一个成员?
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>'
我怎么能检查,如果这是最后itration?
答
您不能使用二进制+
和-
运算符与std::list
迭代器。 std::list
迭代器是双向迭代器,但它们不是随机访问迭代器,这意味着您不能将它们移动任意的常量值。
使用一元++
和--
代替
Field::SegmentValue::const_iterator it_last = m_segmentValue.end();
--it_last;
现在it_last
是最后一个元素的迭代器。只要确保它仍然有效。如果您没有对容器做任何迭代器无效修改,则可以预先计算it_last
并在循环中使用它。否则,您必须根据需要重新计算它。
事实上,在泛型算法它始终是一个好主意,使用--
和++
迭代器更喜欢尽可能地(而不是二进制+ 1
和- 1
),因为它减少了你的算法的要求:二进制+
和-
需要随机访问迭代器,而++
和--
与双向个。
答
试试这个:
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+
。
答
std :: list迭代器不是随机访问,它们是双向的。运营商+不受支持。你需要使用std :: vector来做类似的事情。
答
使用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;
}
答
像这样的东西可能:
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了解您可以或不可以对各种类别的迭代器执行的操作。
答
如何:
if (&*it == &*(m_segmentValue.rbegin()))
即,比较段的地址。
我宁愿在循环前使用'std :: prev'在'end()'上预先计算它。 – jrok 2012-07-09 15:06:01