插入数据方法
在构造map容器后,我们就可以往里面插入数据了。这里讲三种插入数据的方法:
第一种:用insert函数插入pair数据
map<int, string> mapStudent;
mapStudent.insert(pair<int, string>(1,“student_one”));
第二种:用insert函数插入value_type数据
map<int, string> mapStudent;
mapStudent.insert(map<int, string>::value_type (1,"student_one"));
第三种:用insert函数插入make_pair数据
mapStudent.insert(make_pair(1, "student_one"));
第四种:用数组方式插入数据
map<int, string> mapStudent;
mapStudent[1] = “student_one”;
mapStudent[2] = “student_two”;
以上四种用法,虽然都可以实现数据的插入,但是它们是有区别的,当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是不能再插入这个数据的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值,即:如果当前存在该关键字,则覆盖改关键字的值,否则,以改关键字新建一个key—value;
map取值的find、[]、at方法特性对比
详见:https://blog.csdn.net/guotianqing/article/details/108896065
对key不在时,处理的不同
在C ++ 11中map::at
:如果该键不存在,则抛出out_of_range异常;
find:
如果元素不存在,find
返回aMap.end();
[] :如果没有key存在,则[]会创建一个新的键值对,并将value设置成一个默认
初始化的值。
所以最好用:索引操作符[]
进行数据插入,用.find()
/ .at()进行数据
查找。
- 如果纯粹是查找取值,不要用[]操作符,因为它会自动创建不存在的元素
- 正因为上面的原因,[]仅用于非const的情形下。在const map下使用[]会导致编译期错误
- 如果不确定待查找的值是否存在,且不存在也是合理的,则使用find,判断返回值是否是end()
- 如果待查找的值肯定存在,如果不存在就是逻辑上的错误,则使用at,处理out_of_range异常
迭代器
std::map<X, Y>实际储存了一串std::pair<const X, Y>
std::map<std::string, int> m = /* fill it */;
auto it = m.begin();
这里,如果你用*it,那么你将得到map第一个元素的std::pair:
现在你可以接收std::pair的两个元素:
(*it).first会得到key,
(*it).second会得到value。
这等同于it->first和it->second
参考:
浅谈c++中map插入数据的用法
https://www.cnblogs.com/tianzeng/p/9017148.html