
vector拷贝说的道理
Tanpinsary偶然在群里聊到这个了,感觉这个切口对于理解OOP**“封装”**这个概念颇为重要
以下内容由d老师辅助生成,本人整理
浅拷贝与深拷贝区分、
1. 浅拷贝(Shallow Copy)
- 直接复制成员的值:将对象的成员变量(包括指针)逐字节复制到新对象。
- 指针共享内存:新旧对象的指针成员指向同一块内存地址。
例如 默认的拷贝构造函数 和 动态分配的数组 or 指针逐字节复制
特性:
- 当某个类一个对象析构时,另一个也会被析构,同时释放两次内存
- 通过指针实现的拷贝复制,修改会直接影响另一方
1 | class Data { |
2. 深拷贝(Deep Copy)
- 独立复制资源:为新对象分配新的内存,并复制原对象指针指向的所有内容。
- 资源完全独立:新旧对象的指针指向不同的内存区域。
例如 copy方法
1 | class Data { |
特点:
- 安全性:
d1
和d2
析构时不会冲突。 - 独立性:修改
d1.arr
不会影响d2.arr
。
下面是几个常见的拷贝方案
1. 拷贝构造函数
1 | std::vector<int> v1 = {1, 2, 3}; |
浅拷贝
2. 重载赋值运算符(=)
1 | std::vector<int> v1 = {1, 2, 3}; |
浅拷贝
3. 范围构造函数
1 | std::vector<int> v1 = {1, 2, 3}; |
元素级别的拷贝行为:
- 如果元素是值类型(如
int
、double
、std::string
),会直接复制值,新旧vector
中的元素完全独立。 - 如果元素是指针类型(如
int*
),则会复制指针的值(浅拷贝),导致新旧vector
的指针指向同一块内存。
4.std::copy
算法 + back_inserter
1 |
|
深拷贝
建议预先调用v2.reserve(v1.size())
避免多次扩容
5. assign()
方法
覆盖内容拷贝常用
1 | std::vector<int> v1 = {1, 2, 3}; |
深拷贝
其中有任何一个实参是指向 *this 中的迭代器时行为未定义
6. insert()
方法
1 | std::vector<int> v1 = {1, 2, 3}; |
插入拷贝