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") );
}
答案 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";}
会工作吗? 第二种变体可能是正确使用的更有效的垃圾。 不同的是,在这里你插入一对“兔子”,“”与被修改为 “兔子”,“杀手兔”,而第二次插入则指向最终值。