是std :: vector :: begin() - 1未定义?

时间:2013-08-14 07:29:43

标签: c++ stl iterator portability

我需要以向后的顺序迭代一些元素,我正在使用:

for ( /* ... */ it = vec.end() - 1, end = vec.begin() ; it >= end ; --it ) {
    // ...

我现在为某些容器定义end() - 1,包括vector,但现在我需要知道是否还定义了开始递减。

修改

我不知道是否可以使用reverse_iterator,因为我需要将这些迭代器作为参数传递给std :: vector :: erase,从文档中可以看出它们是不同的类型。

2 个答案:

答案 0 :(得分:14)

是的,它未定义。

如果您想反向迭代元素,只需使用rbeginrend。它们是反向迭代器,专门为此目的而设计。如果需要从反向迭代器获取标准迭代器,可以在迭代器上使用base member function

答案 1 :(得分:4)

这是未定义的行为。但为什么不使用反向迭代器rbegin()rend()

std::vector<int> vec{0,1,2,3,4}
for (auto it = vec.rbegin(); it != vec.rend(); ++it) 
{
  std::cout << *it << " ";
}
std::cout << std::endl;

输出

  

4 3 2 1 0