maps是一个存储 < key , value >(键值-映射值)的关联容器,并且按key默认递增有序。这里特别注意map中的key不可重复,只能唯一。
使用STL中的容器肯定需要插入元素,所以我们尝试如何在map中插入元素。
在c++ 98中map的insert操作共有3种方式:
single element (1) pair
insert (const value_type& val);
with hint (2) iterator insert (iterator position, const value_type& val);
range (3) template < class InputIterator > void insert (InputIterator first, InputIterator last);
在c++ 11中insert多了一种方式:
initializer list (4) void insert (initializer_list< value_type > il);
第一种方式就是插入使用pair构造的单个元素,并返回一个pair类型
第二种方式在position的位置插入单个元素 。
第三种方式即插入一个范围内的所有元素。
当然我觉得最简单的方法是使用操作符[ ]进行插入,就类似于数组的赋值。
实例如下:
#include
#include
using namespace std;
int main()
{
map<char, int> mymap;
/*第一种方式插入单个元素*/
mymap.insert(pair<char,int>('a',0));
//mymap.insert(pair("a",1));key与上面插入重复,报错
mymap.insert(pair<char,int>('b',1));
/*第二种方式在mymap开始的位置插入单个元素*/
map<char, int>::iterator it = mymap.begin();
mymap.insert(it, pair<char, int>('c',2));
mymap.insert(it, pair<char, int>('d',3));
/*第三种方式插入一个范围的元素*/
map<char, int> newmap;
newmap.insert(mymap.begin(),mymap.find('c'));
/*还可使用操作符[]插入元素*/
mymap['e'] = 4;
/*打印元素*/
cout<<"mymap中的元素如下:"<<endl;
for(it = mymap.begin(); it != mymap.end(); it++)
{
cout<<it->first<<"->"<<it->second<<endl;
}
cout<<"newmap中的元素如下:"<<endl;
for(it = newmap.begin(); it != newmap.end(); it++)
{
cout<<it->first<<"->"<<it->second<<endl;
}
return 0;
}
说完插入,那么相对的就是删除操作了。
在map中删除元素既可以删除单个元素,也可以删除一个范围内的元素
那么在c++ 98中map的删除操作共有3种方式:
(1) void erase (iterator position);
(2) size_type erase (const key_type& k);
(3) void erase (iterator first, iterator last);
实例如下(来自c++ reference):
// erasing from map
#include
#include
int main ()
{
std::map<char,int> mymap;
std::map<char,int>::iterator it;
// insert some values:
mymap['a']=10;
mymap['b']=20;
mymap['c']=30;
mymap['d']=40;
mymap['e']=50;
mymap['f']=60;
it=mymap.find('b');
mymap.erase (it); // erasing by iterator
mymap.erase ('c'); // erasing by key
it=mymap.find ('e');
mymap.erase ( it, mymap.end() ); // erasing by range
// show content:
for (it=mymap.begin(); it!=mymap.end(); ++it)
std::cout << it->first << " => " << it->second << '\n';
return 0;
}
通过关键字进行查找并返回一个iterator类型的变量。
用法如下:
iterator find (const key_type& k);
find的用法在上面的插入删除实例中都出现了,不再赘述。
这是STL中另一个容器,我觉得与map唯一不同的就是容器中的元素是无序的。
所以上面map的插入删除查找操作这里就不再写了,是一样的。
这里要加一个插入函数,其实map中也有这个函数,即emplace
而emplace与insert的区别就是emplace是往容器中构造对象,而insert是构造完对象后才能插入,顺序相反。
这里说明一下,unordered_map要比map运行效率高,因为在map中插入元素还需要进行排序。