c++ - vector 重新排序的保证

标签 c++ vector language-lawyer

假设我有这段代码:

#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/

相关文章:

Matlab:为 odeset 的 'Vectorized' 属性调整 myODEfun

c++ - C++ 重载解析规则中的缺陷?

c++ - 类模板部分特化中是否允许 noexcept 推导?

c++ - Xcode 对 lambda 函数的支持

c++ 数组初始化

c++ - 将十六进制转储转换为 double

c - 只要您永远不取消引用它,持有未对齐的指针是否定义明确?

c++ - 通过 OpenCV 和 C++ 提高书脊的霍夫线精度/分割

c++ - 从 sql 2008 表中获取 vector

c++ - 切换表示为字符的位的 3 种方法