是否保证C++向量v的v.begin()+v.size()==v.end()
Is it guaranteed that v.begin() + v.size() == v.end() for C++ vector v?
我尝试在第三个元素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_。
相关文章:
- 来自 std::list 的迭代器 .end() 按预期返回"0xcdcdcdcdcdcdcdcd"但 .begin()
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- std::map<struct,struct>::find 找不到匹配项,但是如果我循环通过 begin() 到 end(),我在那里看到匹配项
- 大于65535的C++数组[size]引发不一致的溢出
- 为什么(-1)%vector::size()总是返回0
- 在for循环中使用auto vs decltype(vec.size())来处理字符串的向量
- 循环中的条件:为什么每次都调用strlen(),而vector.size()只调用一次
- 为什么这个 std::queue/指向结构的指针列表直到 List.Size() == 0 才释放内存?
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- vector.size() 在比较中意外工作
- 反转依赖于 end() 的迭代器
- std::multimap<std::chrono::milliseconds, T>::rbegin 在 MSVS-13 中指向 end()?
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- vector.back() 和 vector[vector.size() - 1] 之间的区别?
- 返回 str vs. str.substr(0,str.size()) 在 leetcode 中给了我不同的输出
- remove(str.begin(), str.end(), );无法正常工作(我正在使用视觉工作室 2012)
- 为什么 GCC 不能假设 std::vector::size 在这个循环中不会改变?
- 为什么 --string::end() 可以编译,而 --string.size() 不能编译?
- 是否保证C++向量v的v.begin()+v.size()==v.end()
- 必须size()==end()-begin()吗?演员阵容怎么样