实例化std :: map <>的正确方法是什么

Hob*_*ist 1 c++

Class Base {
public:
    std::map<std::string, std::string> animals;
};
Run Code Online (Sandbox Code Playgroud)

以下哪一项是实例化std :: map <>的正确方法?

Derived::Derived() {
    animals["Rabbit"] = "Killer Rabbit";
    //or
    animals.insert( std::pair<std::string,std::string>("Rabbit","Killer Rabbit") );
}
Run Code Online (Sandbox Code Playgroud)

And*_*owl 6

在函数内部,你应该这样做:

animals["Rabbit"] = "Killer Rabbit";
Run Code Online (Sandbox Code Playgroud)

或这个:

animals.insert(std::make_pair("Rabbit", "Killer Rabbit"));
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,后面的形式可以缩短为:

animals.insert({"Rabbit", "Killer Rabbit"});
Run Code Online (Sandbox Code Playgroud)

C++ 11还提供了另一种可能性,它将就地构建对:

m.emplace("test1", "t2");
Run Code Online (Sandbox Code Playgroud)

正如shakurov在评论中正确提到的那样,第一种形式与其余形式之间的主要区别在于,"Rabbit"如果已存在,则第一种形式将覆盖与该键相关联的值,而其他形式则不会.

此外,正如Dave S所指出的那样- 在评论中 - 第一个形式默认 - 构造值并稍后分配它,而其他三种形式则不然.

  • `animals ["Rabbit"] ="Killer Rabbit";`语句覆盖旧值(如果有的话),`animals.insert(std :: make_pair("Rabbit","Killer Rabbit"));`doesn'吨. (5认同)
  • 第一个也导致它默认构造值类型(在本例中为`std :: string`),这意味着值类型必须是DefaultConstructible.其中第二个不需要任何默认构造函数. (4认同)