复制std::vector:prefer赋值或std::copy
Copying std::vector: prefer assignment or std::copy?
我有两个向量:
std::vector<int> v1, v2;
// Filling v1
...
现在我需要将v1
复制到v2
。有什么理由更喜欢吗
v2 = v1;
至
std::copy (v1.begin(), v1.end(), v2.begin());
(反之亦然)?
一般来说,我更喜欢v2 = v1
:
- 它更短,使意图更加清晰
- 如果
v2
的长度与v1
的长度不同,std::copy
将不起作用(它不会调整它的大小,因此在最坏的情况下,它将保留一些旧元素(v2.size() > v1.size()
),并覆盖程序中其他地方使用的一些随机数据 - 如果
v1
即将过期(并且您使用C++11),您可以很容易地将其修改为move
内容 - 性能分配不太可能比
std::copy
慢,因为实现者可能会在内部使用std::copy
,如果它能带来性能优势的话
总之,std::copy
的表达能力较弱,可能会做错事,甚至不会更快。所以没有任何理由在这里使用它。
如果v2
不够大,如果按现有方式使用copy
,则会导致缓冲区溢出。
您可以使用后插入迭代器,它将在v2
上调用push_back。然而,根据v1
的大小,这可能会导致多次重新分配
copy(v1.begin(), v1.end(), back_inserter(v2));
你最好让vector
正确地管理事情。赋值运算符执行此操作,vector::assign
:也是如此
v2.assign(v1.begin(), v1.end());
我知道赋值运算符是根据vector::assign
实现的。
std::copy
的调用可能会尝试访问目标向量末尾以外的项。
使用分配。
微优化不是你的工作:这是库作者的责任,最终也是编译器的责任。
如果不一定要正确的话,你可以让你的代码变得任意快。
然而,在copy
的情况下,它是否更快还值得怀疑,而且对于一般情况来说,这肯定是不正确的。
它更短。
std::copy
主要用于复制容器的部分。如果您需要复制整个容器,您还可以使用复制构造函数。
到目前为止的分配。更一般地说,无论何时向量的大小可能发生变化,或向量的整个内容发生变化,您都应该更喜欢成员函数。std::copy
唯一合适的时间是,如果您只替换矢量内的一个小范围。
分配更清晰,内部使用std::copy
(或unitizalized_copy
_M_allocate_and_copy
,取决于大小和容量),因此性能相同。
相关文章:
- 为std::string的某个索引赋值
- 使用重载 [] 运算符返回 std::map() 的可赋值
- 使用赋值运算符复制 std::vector
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 非模板 std::reference_wrapper赋值运算符和模板构造函数
- std::constexpr 上下文中的可选赋值运算符
- 对std::unique_ptr数组的赋值
- 派生自 std::exception 的类的赋值运算符
- 重载 std::vector::at 赋值运算符
- C++ std::vector 赋值方法
- 从自身内部替换 std::函数(通过将移动赋值到 *this?)
- std::vector::emplace() 真的在面对抛出移动构造函数/赋值运算符时提供了强大的异常保证吗?
- STL std::map 运算符 [] 在赋值的右侧
- 使用带有下标运算符的赋值运算符将值分配给 std::map
- std::vector 不支持右值赋值
- std::string 的转换运算符无法处理赋值
- std::memcpy或显式字符值赋值-在C++中等于合法
- 如何禁用Visual Studio警告C4244,用于std::vector复制或使用隐式缩小转换进行赋值
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- std::string 赋值运算符如何工作