C ++如何为地图制作浅表副本构造函数

时间:2019-07-02 15:58:16

标签: c++ dictionary pointers reference shallow-copy

在我的作业中,我需要复制一张地图,因此,如果我更改了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;
}

2 个答案:

答案 0 :(得分:1)

说实话,我觉得实际的问题是您不完全了解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反映在{{1 }}和y

答案 1 :(得分:1)

  

在我的作业中,我需要复制一张地图,因此,如果我更改了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

当然,如果将新元素添加到地图1中,则它们将不会在地图2中显示。