C++ inserting unique_ptr in map

前端 未结 3 857
醉梦人生
醉梦人生 2020-12-01 12:00

I have a C++ object of type ObjectArray

typedef map> ObjectArray;

What is the syn

相关标签:
3条回答
  • 2020-12-01 12:08

    If you want to add an existing pointer to insert into the map, you will have to use std::move.

    For example:

    std::unique_ptr<Class1> classPtr(new Class1);
    
    myMap.insert(std::make_pair(0,std::move(classPtr)));
    
    0 讨论(0)
  • 2020-12-01 12:09

    As a first remark, I wouldn't call it ObjectArray if it is a map and not an array.

    Anyway, you can insert objects this way:

    ObjectArray myMap;
    myMap.insert(std::make_pair(0, std::unique_ptr<Class1>(new Class1())));
    

    Or this way:

    ObjectArray myMap;
    myMap[0] = std::unique_ptr<Class1>(new Class1());
    

    The difference between the two forms is that the former will fail if the key 0 is already present in the map, while the second one will overwrite its value with the new one.

    In C++14, you may want to use std::make_unique() instead of constructing the unique_ptr from a new expression. For instance:

    myMap[0] = std::make_unique<Class1>();
    
    0 讨论(0)
  • 2020-12-01 12:29

    In addition to previous answers, I wanted to point out that there is also a method emplace (it's convenient when you cannot/don't want to make a copy), so you can write it like this:

    ObjectArray object_array;
    auto pointer = std::make_unique<Class1>(...);  // since C++14
    object_array.emplace(239LL, std::move(pointer));
    // You can also inline unique pointer:
    object_array.emplace(30LL, std::make_unique<Class1>(...));
    
    0 讨论(0)
提交回复
热议问题