c++ vector复制赋值,调用其元素的复制机制
C++ vector copy assignment, calling which copy mechanism of its elements?
我的类A
显式地实现了它的复制构造函数和复制赋值。
当对这些元素的向量进行复制赋值时,使用哪种复制机制?
:
vector<A> a1, a2(5);
a1 = a2;
将A
的复制构造函数用于a1
的所有新元素,并将a2
的元素作为输入?
还是在a1
中为元素腾出空间,然后使用A
的operator=
和a2
的元素作为输入?
如果a1
在赋值前不是空的怎么办?
它被指定了吗?
我的类的复制构造函数和operator=
不完全做同样的事情(这是不好的做法吗?到目前为止主要是测试的东西)。看起来像是调用了复制构造函数,但我想知道它是否保证是这样的,还是在这个例子中碰巧是这样的。
在这个上下文中,它将调用复制构造函数5次。因为a1
是空的,所以没有任何元素可以让赋值给。所以它们需要复制构造。
一般来说,它将调用复制/移动构造/赋值或删除的适当组合。所有这些都取决于所讨论的向量的大小,您正在执行的特定向量操作以及操作数的值类别。
看起来像调用了复制构造函数,但我想知道它是否保证是这样的,或者在这种情况下它只是碰巧是这样的。
它可以保证对于异常安全的基于swap
的赋值实现:
struct SomeClass
{
SomeClass(const SomeClass& other) { ... }
SomeClass(SomeClass&& other) { ... }
// Copy/move construction is performed while initializing the parameter
void operator=(SomeClass other)
{
this->swap(other);
}
void swap(SomeClass& other) { ... }
};
这种赋值实现的缺点是——由于它的通用性——它不是最优的(例如,在self赋值的情况下,它做了不必要的工作)。
一般来说,如果可以排除异常安全问题,则对对象进行复制赋值可以比销毁对象并构造源对象的原位副本更快。因此,您应该期望追求性能的实现尽可能通过赋值来执行对象的赋值,而不是通过其子对象的复制构造来执行。
相关文章:
- 使用strcpy将char数组的元素复制到另一个数组
- 为什么复制而不是移动数据元素?
- 复制包含C++所有元素的对象!(构造函数和赋值,最佳实践?
- 调整大小和复制哈希表数组中的元素
- 如何在 2d 矢量 c++ 中复制元素并将其放在原始元素旁边
- C++将所有元素从矢量复制到地图/unordered_map的最佳方法
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- list.push_back似乎复制了最后添加的元素
- 如何使用指针C++将元素从2D数组复制到1D数组
- 将 Vector<String > 元素复制到其他 Vector<String>* (1 作为
- 如何将 n 个连续元素插入到元素类型不可复制的 std::vector 中?
- 如何将结构深度复制到向量的每个元素
- r-在Rcpp和C++之间转换矢量(使用Rcpp::as或Rcpp:::wrap)是否会创建一个新的矢量并复制元素
- C 是否每次访问数组时都复制元素?
- 在变量之间移动队列而不复制元素
- 矢量中的不可复制元素
- 无序映射插入复制元素
- Mat::p ush_back(x) 是否复制 x 元素
- 基于条件从vector复制元素