C++ 如何为地图创建浅拷贝构造函数
C++ How to make a shallow copy constructor for a map
在我的家庭作业中,我需要复制一个地图,所以如果我在mapB中更改某些内容,mapA应该会发生相同的更改,但不知道如何。
我四处搜索,发现最接近的东西是:Java地图的浅拷贝 但遗憾的是,这是在 Java 而不是C++。
我这样想过,但它不起作用。为什么,什么是正确的代码?
class Mymap
{
private:
std::map <int, int> *PM;
public:
Mymap(std::map <int, int>* x)
{
PM = new std::map<int,int>(x);
}
};
int main()
{
std::map<int, int> mapA;
Mymap mapB(mapA);
return 0;
}
老实说,我觉得实际问题是你没有完全理解 c++ 中浅拷贝和深拷贝之间的区别。
用非常简单的术语来说:浅拷贝=复制指针,深拷贝=复制指针指向的内容。
您的代码是深层复制的变体,通过获取指针指向的内容并从中创建新实例(假设它会编译)。
我给你一个简单的例子,剩下的交给你:
#include <iostream>
struct foo {
int * some_pointer;
void deep_copy( const foo& other) {
// copy the value
*some_pointer = *(other.some_pointer);
}
void shallow_copy( const foo& other) {
// make some_pointer point to the same as other.some_pointer
some_pointer = other.some_pointer;
}
};
int main() {
int x = 0;
int y = 42;
foo f{&x};
foo g{&y};
f.deep_copy(g);
y = 3;
std::cout << *f.some_pointer << "n";
std::cout << *g.some_pointer << "n";
f.shallow_copy(g);
y = 5;
std::cout << *f.some_pointer << "n";
std::cout << *g.some_pointer << "n";
}
这将打印:
42
3
5
5
因为首先f.deep_copy(g);
复制该值,然后更改y
的值(最初绑定到g
)对f
没有影响。
另一方面,在f.shallow_copy(g);
之后,f.some_pointer
和g.some_pointer
都指向y
,因此修改y
反映在f
和g
上。
在我的家庭作业中,我需要复制一张地图,所以如果我在 mapB 中更改某些内容,mapA 也应该发生相同的更改,但不知道如何做。
我知道您希望拥有两个具有相同值的地图,如果您在一张地图中修改对象(值),那么此修改将反映在第二张地图中。下面的代码展示了如何做到这一点:
using map_type = std::map<int, std::shared_ptr<std::string>>;
map_type m1;
// Here store some value in m1
m1[1] = std::make_shared<std::string>("one");
// Make a copy, std::string objects are not copied, only pointers are being copied
map_type m2 = m1;
// Now modify m1 map
*m1[1] = "its one";
// And m2 will contain the above m1 modification
std::cout << *m2[1];
https://coliru.stacked-crooked.com/a/d37a246ff0d1bb59
当然,如果您向地图一添加新元素,那么它们将不会在地图二中看到。
相关文章:
- 与浅拷贝构造函数和深拷贝构造函数混淆
- 使用复制构造函数修复浅拷贝
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- 在构造函数中浅拷贝字符串数组
- 为什么移动语义与动态 mem 分配中的浅拷贝具有相同的行为
- 在函数中传递带有指针成员的结构是浅拷贝或深拷贝在 C 中
- C++ 如何为地图创建浅拷贝构造函数
- 浅拷贝到协议缓冲区的字节字段中
- C++ 标准::字符串意外更改。我认为这个问题是关于深和浅拷贝的
- 为什么下面的类不对数组 arr 进行浅拷贝?
- 在C++中使用浅拷贝而不是引用的原因
- C++需要一个浅拷贝,但并不完全如此
- STD向量C++ - 深拷贝或浅拷贝
- 浅拷贝后追加字符指针
- 带矢量的浅拷贝
- 康斯特指针浅拷贝
- 从一个数组到另一个数组的选择性浅拷贝
- 懒惰复制-如何从浅拷贝创建深拷贝
- QVector::replace()创建深拷贝吗?
- 静态内存分配中的浅拷贝构造函数问题