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

时间:2013-04-01 14:04:22

标签: c++

Class Base {
public:
    std::map<std::string, std::string> animals;
};

以下哪项是实例化std :: map&lt;&gt;的正确方法?

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

3 个答案:

答案 0 :(得分:5)

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

animals["Rabbit"] = "Killer Rabbit";

或者这个:

animals.insert(std::make_pair("Rabbit", "Killer Rabbit"));

在C ++ 11中,上面的形式可以简化为:

animals.insert({"Rabbit", "Killer Rabbit"});

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

m.emplace("test1", "t2");

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

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

答案 1 :(得分:1)

答案取决于你期望发生的事情......

如果密钥animals.insert(std::make_pair("Rabbit", "Killer Rabbit"));已在使用中,则"rabbit"将失败。请参阅this

animals["Rabbit"] = "Killer Rabbit";方法将始终更改animals["Rabbit"]元素。看看operator[] reference

现有方法具有优势。您可以指定从哪里开始查找键值。这可能会节省时间。

答案 2 :(得分:0)

Class Derived {
Public:
    Derived(){ animals["Rabbit"] = "Killer Rabbit";}

会工作吗? 第二种变体可能是正确使用的更有效的垃圾。 不同的是,在这里你插入一对“兔子”,“”与被修改为 “兔子”,“杀手兔”,而第二次插入则指向最终值。