关于map是什么,这里就不多叙述了。
直接正题,常用的map插入操作有三种方法:通过pair<key_type,value_type>、通过value_type插入数据、还有一种类似于数组的形式插入数据,关键字就是数组下标。
关于三种插入方式的区别:前两者的效果是一样的,但是由于数据集合唯一性,如果一个key对应的value上有值的话,那么再次往这个key上插入一个新的value会失败,
可以使用pair模板类型进行测试。
由于map是有序的,所以查找的话可以直接使用key进行查找,比如说find(key)就可以查到key对应的value了,find函数如果查到就返回对应的迭代器的位置,若没找到就是返回end()函数的位置。
使用迭代器获取map中的数据,其数据类型是一个std::pair对象,包括first成员和second成员,对应的是key和value。
lower_bound():用于返回key关键字在map中的下界;
upper_bound():用于返回key关键字在map中的上界;
理解:若找到key,那么两个函数都是返回他们的对应的迭代器,若没找到,那么lower_bound函数返回距离查找的key最近的下界的那个key对应的迭代器,upper_bound与此相反。
Equal_range():返回一个std::pair对象,它有三个参数,前两个是指定序列的正向迭代器,最后一个参数是要查询的元素,其first指向的是不小于第三个参数的一个元素,second指向的是不大于第三个参数的一个元素。
可以理解为:在第一个迭代器与第二个迭代器之间找第三个元素的值。
移除map中的某个条目使用erase(),它有一个函数形式如下
size_type erase(const Key&key);//通过关键字删除
若使用clear()函数删除,那么相当于erase函数的另一个形式的使用:erase(map.begin(),map.end());//范围删除
map的swap函数,不是一个容器中的元素交换,而是两个容器所有元素的交换。
STL中的排序默认是使用小于号排序的,map本身是有序的,按照key从小到大进行排序,如果key是结构体的话,这时候的排序问题,可以通过两种方式解决,一种是重载小于号,另一种可以使用仿函数。
==========================================================性能比较来源于https://blog.csdn.net/a418382926/article/details/22302907================================================
map和hash_map性能比较总结:
hash_map的添加和删除操作比map要慢,尤其是删除操作hash_map比map可能慢1000倍;从而得到结论是删除和插入操作较多的情况下,map比hash_map的性能更好,添加和删除的数据量越大越明显。
map的遍历性能高于hash_map,而查找性能则相反,hash_map比map要好,数据量越大查找次数越多,表现就越好。
一般应用情况下,我们保存的数据不超过100万份,查找的频繁程度不高情况下使用map性能比较好;而保存的数据较多时(超过100万),查找频繁时使用hash_map的性能就高于map了。