std :: vector <T> :: resize(n,val)是否足以进行初始化?

She*_*ohn 5 c++ initialization vector c++11

这是一个特定于C++ 11的问题.假设我std::vector<T> v已经使用了一个向量,并且我想将其大小调整为n使用现有值初始化的元素T val.(典型用例:vector是要回收的实例的成员).

以下方式的优缺点是什么,哪种方式最有效?

1)std::vector<T>::resize( n, val )初始化是否足够?

v.clear();
v.resize( n, val );
Run Code Online (Sandbox Code Playgroud)

2)如果没有,那么我假设以下是正确的?

v.clear();
v.resize(n);
std::fill( v.begin(), v.end(), val );
Run Code Online (Sandbox Code Playgroud)

3)交换怎么样?

v.swap( std::vector<T>( n, val ) );
Run Code Online (Sandbox Code Playgroud)

Ric*_*ges 8

为什么不使用专为此工作设计的界面?

v.assign(n, val);
Run Code Online (Sandbox Code Playgroud)

文档在这里


Nei*_*irk 5

(4)

std::fill(v.begin(), std::min(v.begin() + n, v.end()), val);
v.resize(n, val);
Run Code Online (Sandbox Code Playgroud)

如果T具有合适的分配行为,其至少比构建新分配行为便宜,则使用(4).这是T = int(赋值和构造相同)和T = std :: string的情况(赋值可以比构造更快,因为它可以使用现有缓冲区).

如果T具有相同的分配和构造成本(例如T = int),那么(1)也可以用于清晰而不损失性能.

如果T不能被分配,或者由于某种原因,分配比构建(稀有)更昂贵,那么使用(1)

(1)可以通过使用v.assign(n, val);(kudos到@Casey)简化

我不知道(4)是否会使用相同的性能assign.我不知道分配是否(具有讽刺意义,给定名称)将新元素分配给现有元素,或者重新构建它们.

编辑:(4)可能的改进,我没有测试过.它可以避免在矢量容量变化期间复制/移动的开销.

if (n <= v.capacity())
{
    std::fill(v.begin(), std::min(v.begin() + n, v.end()), val);
    v.resize(n, val);
}
else
{
    v.assign(n, val);
}
Run Code Online (Sandbox Code Playgroud)