如何实现STL的深拷贝
时间: 2023-07-19 20:36:57 浏览: 83
STL 中的大多数容器都提供了拷贝构造函数和赋值运算符,它们会执行深拷贝。这些容器包括 vector、list、deque、set、map 等。
以 vector 为例,如果要实现深拷贝,可以使用以下方法:
```
vector<int> a = {1, 2, 3}; // 创建 a
// 使用拷贝构造函数创建 b,执行深拷贝
vector<int> b(a);
// 使用赋值运算符创建 c,执行深拷贝
vector<int> c;
c = a;
```
在上述代码中,使用拷贝构造函数和赋值运算符都会执行深拷贝,因为它们会为新的向量分配独立的内存空间,并复制原始向量的元素。如果原始向量发生变化,新的向量不会受到影响。
需要注意的是,对于自定义类型的容器,需要实现拷贝构造函数和赋值运算符,以便执行深拷贝。例如,如果定义了一个自定义类型 `MyClass` 的向量,可以这样实现拷贝构造函数和赋值运算符:
```
class MyClass {
public:
// 假设 MyClass 有一个 int 类型的成员变量 x
MyClass(int x = 0) : x_(x) {}
// 拷贝构造函数,执行深拷贝
MyClass(const MyClass& other) : x_(other.x_) {}
// 赋值运算符,执行深拷贝
MyClass& operator=(const MyClass& other) {
if (this != &other) {
x_ = other.x_;
}
return *this;
}
private:
int x_;
};
vector<MyClass> a = {MyClass(1), MyClass(2), MyClass(3)}; // 创建 a
// 使用拷贝构造函数创建 b,执行深拷贝
vector<MyClass> b(a);
// 使用赋值运算符创建 c,执行深拷贝
vector<MyClass> c;
c = a;
```
在上述代码中,自定义类型 `MyClass` 实现了拷贝构造函数和赋值运算符,在创建新的向量时会执行深拷贝。
阅读全文