假设我有这段代码:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vec {10, 15, 20};
auto itr = vec.begin();
vec.erase(itr);
for(const auto& element : vec)
{
std::cout << element << " ";
}
return 0;
}
这给了我预期的 15 20
。现在,cppreference 说 this关于erase()
:
Invalidates iterators and references at or after the point of the erase, including the end() iterator
很公平,但这是标准对 vector::erase()
提供的唯一保证吗?
是否允许 vector 在删除迭代器之后对其元素重新排序?
例如,这些条件是否保证在删除之后成立,这意味着 erase()
迭代器之后的所有元素向左移动 1:
vec[0] == 15
vec[1] == 20
或者是否允许实现在他们认为合适的情况下移动值,从而创建 vec[0] == 20
等场景?
我想要一份标准相关部分的报价。
最佳答案
让我们从头开始:
23.2.3 Sequence containers
A sequence container organizes a finite set of objects, all of the same type, into a strictly linear arrangement. The library provides four basic kinds of sequence containers: vector, forward_list, list, and deque.
强调“严格线性排列”。这是明确的。
这个定义之后是一个名为“序列容器要求”的表格,它描述了erase()
这样:
a.erase(q) [ ... ] Effects: Erases the element pointed to by q
结合起来,这没有留下解释的回旋余地。 vector 中的元素始终处于“严格的线性排列”状态,因此当其中一个元素被 erase()
d 时,只有一种可能的结果。
关于c++ - vector 重新排序的保证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43564854/