std :: vector :: reserve是否保证在这种情况下实现不会使迭代器失效?

Ric*_*ges 14 c++ stdvector language-lawyer c++11

这是一个打算:

a)接受int的向量

b)对于输入向量中的每个int,追加此int的逆

先决条件:无

postconditions:返回vector的size()是2*输入向量的大小.

请注意,矢量是就地修改的.

题:

在变换期间,此函数是否严格定义了与迭代器失效相关的行为?

奖金:

是否有更好/更简洁/更健壮的方式来编写它?

码:

std::vector<int> append_negatives(std::vector<int> v)
{
    v.reserve(v.size() * 2);
    std::transform(begin(v), end(v), 
                   back_inserter(v), 
                   [](auto&& x) { return -x; });
    return v;
}
Run Code Online (Sandbox Code Playgroud)

use*_*670 14

只要您不超过预分配容量,就不会发生重新分配,也不会使引用矢量项的引用或迭代器失效.但是,由于返回的迭代器end()未引用任何向量项,因此它仍可能无效.

23.3.11.3载体容量[vector.capacity]

  1. ...在调用之后发生的插入期间不应进行重新分配,reserve()直到插入使向量的大小大于值的值为止.capacity()

...

23.3.11.5向量修饰符[vector.modifiers]

  1. ...如果没有重新分配,插入点之前的所有迭代器和引用仍然有效.

  • 重新:第二个引用,这会导致`end`迭代器的失效吗? (2认同)