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

Is it guaranteed that v.begin() + v.size() == v.end() for C++ vector v?

本文关键字:size end C++ 向量 是否 begin      更新时间:2023-10-16

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

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

我确信,当i介于0(包含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);
}

但是,像这个问题的开头那样只使用一行会更简洁。在实践中,这个问题一开始的代码是有效的,但我想确保它在任何地方都有效。我尝试搜索Standard,但找不到随机访问迭代器的此属性。

如文件所述

pos-迭代器,内容将插入到该迭代器之前pos可能是end()迭代器

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

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

是的,否则这个循环:

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

将不能正常工作,因为它必须精确地执行CCD_ 13 CCD_。

相关文章: