作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的家庭作业中,我需要复制一张 map ,这样如果我在 mapB 中更改某些内容,mapA 应该也会发生相同的更改,但不知道如何更改。
我四处搜索,找到的最接近的是:Shallow copy of a Map in 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
的值(最初绑定(bind)到 g
) 对 f
没有影响。
另一方面,在 f.shallow_copy(g);
之后,f.some_pointer
和 g.some_pointer
都指向 y
,因此修改 y
会反射(reflect)在 f
和 g
上。
关于C++如何为 map 制作浅拷贝构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56856227/
我是一名优秀的程序员,十分优秀!