一、STL map [ ]和insert的差别
参考https://blog.csdn.net/houzhuoming1/article/details/49508461
参考http://www.cnblogs.com/kex1n/archive/2011/11/16/2251520.html
STL中的map是一个key-value的数据结构 ,每一个key对应着一个值,而且key是唯一的,底层采用红黑树的数据结构实现。在使用map的过程中,有两种方式进行数据的插入,第一种是使用下标的方式,也就是[],第二种是使用insert接口,它们主要的区别如下:
- 下标的方式插入,如果原本key不存在则会先创建对应的记录,然后再进行赋值;
- insert方式插入,如果key不存在,则插入记录,如果存在则什么都不做。
map<int, char> m; m[1] = 'a'; // 首先初始化话m[1],然后在给m[1]赋值为'a' m[1] = 'b'; // **修改m[1]的值为'b'** m.insert<pair<int, char>(2, 'c')> // key=2不存在,则插入该记录,m[2]的值为'c' m.insert<pair<int, char>(2, 'd')> // **key=2存在,则什么也不做,m[2]的值仍为'c'**
在map中插入元素
改变map中的条目非常简单,因为map类已经对[]操作符进行了重载
enumMap[1] = "One";
enumMap[2] = "Two";
.....这样非常直观,但存在一个性能的问题。插入2时,先在enumMap中查找主键为2的项,没发现,然后将一个新的对象插入enumMap,键是2,值是一个空字符串,插入完成后,将字符串赋为"Two"; 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。我们可以用以下方法来避免开销:
enumMap.insert(map<int, CString> :: value_type(2, "Two"))
insert()方法:若插入的元素的键值已经存在于map中,那么插入就会失败,不会修改元素的键对应的值;若键值在map中查不到,那么就会将该新元素加到map中去。
下标[key]方法:若插入元素的键值已经存在于map中,那么会更新该键值对应的值为新的元素的值;若该键值在map中找不到,那么就会新建一个键值为该键(key)的元素,并将key对应的值赋值为默认值(默认构造函数生成的对象)。