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)
(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)
| 归档时间: |
|
| 查看次数: |
367 次 |
| 最近记录: |