将元素插入地图的推荐方法
可能重复:
在STL地图中,使用map :: insert比[]更好吗?
我想知道,当我将元素插入到地图中时,推荐的方法是什么。 我是不是该
map[key] = value;
要么
map.insert(std::pair<key_type, value_type>(key, value));
我做了以下快速testing:
#include <map> #include <string> #include <iostream> class Food { public: Food(const std::string& name) : name(name) { std::cout << "constructor with string parameter" << std::endl; } Food(const Food& f) : name(f.name) { std::cout << "copy" << std::endl; } Food& operator=(const Food& f) { name = f.name; std::cout << "=" << std::endl; return *this; } Food() { std::cout << "default" << std::endl; } std::string name; }; int main() { std::map<std::string, Food> m0; /* 1) constructor with string parameter 2) copy 3) copy 4) copy */ m0.insert(std::pair<std::string, Food>("Key", Food("Ice Cream"))); /* 1) constructor with string parameter 2) default 3) copy 4) copy 5) = */ // If we do not provide default constructor. // C2512: 'Food::Food' : no appropriate default constructor available m0["Key"] = Food("Ice Cream"); }
- 我通过使用成员函数
insert
来实现,将涉及less量的函数调用。 那么,是用insert
一个推荐的方式? - 为什么使用
map[key] = value
方式时需要默认构造函数?
我知道insert
不覆盖存在键值对,但map[key] = value
。 然而,这是我考虑的唯一因素,在两者之间进行select?
怎么样
- 性能
- 值的默认构造函数的可用性
- ???
-
insert
不是推荐的方式 – 这是插入到地图的方法之一。 与operator[]
的区别在于insert
可以判断元素是否插入到映射中。 而且,如果你的类没有默认的构造函数,你就不得不使用insert
。 -
operator[]
需要默认构造函数,因为映射检查元素是否存在。 如果不存在,则使用默认构造函数创build一个,并返回一个引用(或对其的const引用)。
由于映射容器不允许重复的键值,因此插入操作会检查插入的每个元素是否已经在具有相同键值的容器中存在另一个元素,如果是,则不插入该元素并且其映射值在任何办法。
如果你想插入一个新的元素,使用insert
。 insert
不会覆盖现有的元素,并且可以validation以前没有存在的元素:
if ( !myMap.insert( std::make_pair( key, value ) ).second ) { // Element already present... }
如果要覆盖可能存在的元素,请使用[]
:
myMap[ key ] = value; assert( myMap.find( key )->second == value ); // post-condition
此表格将覆盖任何现有的条目。
去引用:
由于映射容器不允许重复的键值,因此插入操作会检查插入的每个元素是否已经在具有相同键值的容器中存在另一个元素,如果是,则不插入该元素并且其映射值在任何办法。
所以插入不会改变的价值如果密钥已经存在,[]运营商将。
编辑:
这让我想起了另一个最近的问题 – 为什么使用()而不是[]运算符来检索vector的值。 显然,如果索引超出范围,()会引发exception,而[]不会。 在这些情况下,最好查看function的文档,因为它们会给你所有的细节。 但总的来说,没有(或至less不应该是)两个function/操作员完全相同的事情。
我的猜测是,在内部,insert()将首先检查input,然后本身使用[]运算符。
map[key] = value
提供了更简单的语法。 阅读和写作更容易。
您需要具有默认构造函数的原因是在分配之前对map[key]
进行评估。 如果map中不存在键,则会创build新的(具有默认构造函数),并且从operator[]
返回对其的引用。