gpt4 book ai didi

C++如何为 map 制作浅拷贝构造函数

转载 作者:行者123 更新时间:2023-11-28 01:19:59 26 4
gpt4 key购买 nike

在我的家庭作业中,我需要复制一张 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_pointerg.some_pointer 都指向 y,因此修改 y 会反射(reflect)在 fg 上。

关于C++如何为 map 制作浅拷贝构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56856227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com