Как установить значение для карты без конструктора копирования? - PullRequest
3 голосов
/ 24 января 2020

Необходимо заполнить экземпляры не копируемого класса на карте. Например, с этим кодом:

#include <map>

class NoCopyClass
{
    public:
        NoCopyClass() {};
        NoCopyClass(int value)  {};

        NoCopyClass& operator=(const NoCopyClass&) = delete;

};

int main()
{
    std::map<int, NoCopyClass> my_map;
    my_map[3] = NoCopyClass(20);
}

Не удастся скомпилировать, если вы не закомментируете удаление конструктора копирования. Вы можете попробовать это здесь: https://onlinegdb.com/ByBh0NubU

Как правильно добавить новый элемент карты, когда класс не копируется?

Огромное спасибо!

Ответы [ 2 ]

7 голосов
/ 24 января 2020

Попробуйте использовать emplace() для создания объекта на месте вместо копирования уже созданного объекта:

int main()
{
    std::map<int, NoCopyClass> my_map;
    my_map.emplace(3, 20);
}
1 голос
/ 24 января 2020

Попробуйте:

#include <map>

class NoCopyClass {
public:
    NoCopyClass() {};
    NoCopyClass(int value)  {};

    NoCopyClass& operator=(const NoCopyClass&) = delete;
};

int main() {
    std::map<int, NoCopyClass> my_map;

    // 1. option

    my_map.insert(std::make_pair(3, 30));

    // or 2. option

    my_map.emplace(std::make_pair(4, 40));

    // or 3. option

    my_map.emplace(5, 50);

    // or 4. option

    my_map.emplace(std::piecewise_construct,
                   std::forward_as_tuple(6),
                   std::forward_as_tuple(60));

    // or 5. option (from C++17)

    my_map.try_emplace(7, 70);

    return 0;
}

Проверьте это live

Опции:

  1. использует конструктор перемещения std::pair ,
  2. использует std::pair конструктор конвертирующих ходов
  3. использует std::pair конструктор шаблонов
  4. использует std::pair кусочный конструктор
  5. если ключ уже существует в контейнере, он ничего не делает; в противном случае ведет себя как emplace, за исключением того, что элемент создается как value_type
...