C ++ Как создать конструктор поверхностных копий для карты - PullRequest
0 голосов
/ 02 июля 2019

В моей домашней работе мне нужно скопировать карту, поэтому, если я что-то изменяю в 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;
}

Ответы [ 2 ]

1 голос
/ 02 июля 2019

В моей домашней работе мне нужно скопировать карту, поэтому, если я что-то изменяю в mapB, то же самое должно произойти и с mapA, но я не могу понять, как это сделать.

IЯ понимаю, что вы хотите иметь две карты с одинаковыми значениями, и если вы измените объект (значение) на одной карте, то это изменение будет отражено на второй карте.Ниже приведен код, как это сделать:

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 голос
/ 02 июля 2019

Если честно, у меня такое чувство, что реальная проблема в том, что вы не до конца понимаете разницу между мелкой копией и глубокой копией в 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.

...