c++ - 是否保证 C++ vector v 的 v.begin() + v.size() == v.end() ?

标签 c++ vector stl iterator

我尝试将 value 插入到 C++ vector v 中,位于第 i 元素之前(或在元素 (i-1) 之后) )。代码很简单

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);
}

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

最佳答案

documentation所述

pos - iterator before which the content will be inserted. pos may be the end() iterator

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

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

是的,否则这个循环:

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

无法正常工作,因为它必须精确执行 ++itvec.size() 次。

关于c++ - 是否保证 C++ vector v 的 v.begin() + v.size() == v.end() ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46879157/

相关文章:

c++ - C++ MFC 库中无法解析的外部符号

c++ - std::shared_ptr 的 vector 丢失数据

arrays - C++ - 用一个元素初始化数组向量

arrays - 在 Rust 中将数组值推送到向量

c++ - 无法使用 pcap_findalldevs 获取 ip 地址

c++ - 评估潜在常量表达式期间的未定义行为

c++ - 为 std::regex_match 使用自定义分配器

c++ - vec.erase(vec.end());合法的?

c++ - 字符串到 vector 的转换抛出 std::bad_alloc

c++ - std::list、std::vector 方法和 malloc()