是否保证v.begin()+ v.size()== v.end()用于C ++向量v?

时间:2017-10-22 21:03:46

标签: c++ vector stl iterator

我尝试在value - 元素之前(或在元素v之后)将i插入到C ++向量(i-1)中。代码非常简单

v.insert(v.begin() + i, value);

我确信当i介于0和v.size()之间时,此语句有效。此外,我认为当i严格大于v.size()或负数时,该语句具有未定义的行为。但是如果i == v.size()怎么办?那么v.begin() + i是一个有效的迭代器吗?是否保证v.begin() + v.size() == v.end()

如果有保证,您能参考标准的确切部分吗?此外,如果保证在标准版本之间发生变化,那么了解这些变化将非常有用。

如果没有这些保证,我可能应该使用以下代码:

if (i == v.size()) {
    v.insert(v.end(), value); // or just v.push_back(value);
} else {
    v.insert(v.begin() + i, value);
}

但是在这个问题的开头只使用一行就更简洁了。在实践中,从这个问题的开头的代码工作,但我想确保它在任何地方都有效。我试图搜索标准但无法找到随机访问迭代器的这个属性。

1 个答案:

答案 0 :(得分:3)

正如documentation

所述
  

pos - iterator,在此之前插入内容。 pos可能是end()迭代器

所以是的,您可以使用end()。至于你的另一个问题:

  

是否保证v.begin()+ v.size()== v.end()?

是的,否则这个循环:

for( auto it = vec.begin(); it != vec.end(); ++it ) ...

无法正常工作,因为它必须完全++it次执行vec.size()