2012-07-09 172 views
1

我有一个像下面如何检查这是否是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?

回答

4

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

使用一元++--代替

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

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

事实上,在泛型算法它始终是一个好主意,使用--++迭代器更喜欢尽可能地(而不是二进制+ 1- 1),因为它减少了你的算法的要求:二进制+-需要随机访问迭代器,而++--双向个。

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+

0

std :: list迭代器不是随机访问,它们是双向的。运营商+不受支持。你需要使用std :: vector来做类似的事情。

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; 
} 
+0

我宁愿在循环前使用'std :: prev'在'end()'上预先计算它。 – jrok 2012-07-09 15:06:01

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了解您可以或不可以对各种类别的迭代器执行的操作。

0

如何:

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

即,比较段的地址。

相关问题