2016-10-02 64 views
1

是否允许增加已在end()的迭代器变量it,即auto it = v.end()它允许增加一个结束迭代器吗?

  • 允许一般吗?
  • 如果不是,是不是允许为vector
  • 如果是,则为++it也许幂等性如果it==v.end()

我问,因为我偶然发现这样的代码:

std::vector<int> v{ 1, 2, 3, 4, 5, 6, 7 }; 
// delete every other element 
for(auto it=v.begin(); it<v.end(); ++it) { // it<end ok? ++it ok on end? 
    it = v.erase(it); 
} 

它工作正常使用g ++ - 6,但就是没有证据。

对于一个it<v.end()可能只能与vectors,我想它应该读it!=v.end()一般。但是在这个例子中,如果++it已经结束,那么它将不会识别v的结尾。

+0

使用'!='将达到与<<相同的效果,减去整个小于零部件... – user2296177

+0

无论如何,您的代码在逻辑上被打破。这就是为什么这样的代码通常会将'++ it'移到body中的else ++ it(假设首先有一个条件的'.erase';否则,循环是什么?) –

+0

@LightnessRacesinOrbit oh ,你是说因为我只删除每一个第二个元素?不,那是设计。但你是对的,我应该提到这一点。就像现在这样,它看起来很坏,我同意。我将添加代码评论。 – towi

回答

4

否行为未定义。您可以将迭代器设置为结束(),但您不得增加或取消引用它。

只要支持容器不是空的,您可以减少它。

+0

从工作草案看来,只要你不取消引用,你似乎可以递增迭代器多少次。它对于输入和输出迭代器都是有效的,因此它们都是来自它们的_derives_(作为示例向前迭代器)。我宁愿说增加迭代器不是UB,除非你决定取消引用这些迭代器。 – skypjack

+0

矢量的迭代器必须满足前向迭代器的要求。前向迭代器必须满足输入迭代器的要求。输入迭代器可以递增,并且必须确保'i ++'返回一个可以解引用或者已经结束的迭代器。因此'i ++'似乎不是UB。请注意,递增指针也不是UB,当您解除引用时会出现问题。 – skypjack

+2

“请注意,增加指针也不是UB”。这是不正确的。只允许在指针运算有效的情况下增加指针(例如数组,一个通过数组,一个通过标量)。 – Bathsheba