C++ STL Map/unordered_map详解

一、Map

(1)map简介

maps是一个存储 < key , value >(键值-映射值)的关联容器,并且按key默认递增有序。这里特别注意map中的key不可重复,只能唯一。

(2)插入元素

使用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;
 } 

说完插入,那么相对的就是删除操作了。

(3)删除元素

在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;
 }

(4)查找元素

通过关键字进行查找并返回一个iterator类型的变量。
用法如下:

iterator find (const key_type& k);

find的用法在上面的插入删除实例中都出现了,不再赘述。

二、unordered_map

这是STL中另一个容器,我觉得与map唯一不同的就是容器中的元素是无序的。
所以上面map的插入删除查找操作这里就不再写了,是一样的。
这里要加一个插入函数,其实map中也有这个函数,即emplace
而emplace与insert的区别就是emplace是往容器中构造对象,而insert是构造完对象后才能插入,顺序相反。

这里说明一下,unordered_map要比map运行效率高,因为在map中插入元素还需要进行排序。

你可能感兴趣的:(STL)