c++容器之map和unordered_map

余生长醉 提交于 2019-12-02 06:04:49

1、简介
map需要的头文件是#include < map >
map是一类关联性容器,它的特点是增加和删除节点对迭代器的影响很小,除了那个操作节点,对其他的节点都没有什么影响。对于迭代器来说,可以修改实值,而不能修改key。
我感觉map比较好用的就是key-value对,其中key和value可以是任意你需要的类型,比如map<int, string> m;
根据key值快速查找记录,查找的复杂度基本是O(logn)

2、unordered_map与map
内部实现机理

map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素,因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行这样的操作,故红黑树的效率决定了map的效率。
unordered_map: unordered_map内部实现了一个哈希表,因此其元素的排列顺序是杂乱的,无序的
优缺点以及适用处

map

优点:
有序性,这是map结构最大的优点,其元素的有序性在很多应用中都会简化很多的操作
红黑树,内部实现一个红黑书使得map的很多操作在的时间复杂度下就可以实现,因此效率非常的高

缺点:

空间占用率高,因为map内部实现了红黑树,虽然提高了运行效率,但是因为每一个节点都需要额外保存父节点,孩子节点以及红/黑性质,使得每一个节点都占用大量的空间
适用处,对于那些有顺序要求的问题,用map会更高效一些

unordered_map

优点:
因为内部实现了哈希表,因此其查找速度非常的快

缺点:
哈希表的建立比较耗费时间
适用处,对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map

3、数据的插入

map<int ,string> mapname;  
 
mapname.insert(pair<int, string>(102,"liao"));
 
mapname.insert(map<int,string>::value_type(321,"xiaona"));
 
mapname[112] = "hahaha";//map中最简单最常用的插入添加!

//数据的插入–第一种:用insert函数插入pair数据

#include <map>  
#include <string>  
#include <iostream>  
using namespace std;  
int main()  
{ 
	  
    map<int, string> mapStudent;  
  
    mapStudent.insert(pair<int, string>(1, "student_one"));  
  
mapStudent.insert(pair<int, string>(2, "student_two"));  

mapStudent.insert(pair<int, string>(3, "student_three"));  

map<int, string>::iterator iter;  

for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  

   cout<<iter->first<<' '<<iter->second<<endl;  

}

//第二种:用insert函数插入value_type数据,下面举例说明

#include <map>  
  
#include <string>  
  
#include <iostream>  
  
using namespace std;  
  
int main()  
  
{  
  
    map<int, string> mapStudent;  
  
    mapStudent.insert(map<int, string>::value_type (1, "student_one"));  
  
    mapStudent.insert(map<int, string>::value_type (2, "student_two"));  
  
    mapStudent.insert(map<int, string>::value_type (3, "student_three"));  
  
    map<int, string>::iterator iter;  
  
    for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
  
       cout<<iter->first<<' '<<iter->second<<endl;  
  
} 

//第三种:用数组方式插入数据,下面举例说明

#include <map>  
  
#include <string>  
  
#include <iostream>  
  
using namespace std;  
  
int main()  
  
{  
  
    map<int, string> mapStudent;  
  
    mapStudent[1] = "student_one";  
  
    mapStudent[2] = "student_two";  
  
    mapStudent[3] = "student_three";  
  
    map<int, string>::iterator iter;  
  
    for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  
  
        cout<<iter->first<<' '<<iter->second<<endl;  
  
}  

4、map的排序

map中的元素是自动按Key升序排序,所以不能对map用sort函数;

  #include <map>
  #include <iostream>
 
  using namespace std;
 
 int main( )
 {
   map <int, int> m1;
   map <int, int>::iterator m1_Iter;
 
   m1.insert ( pair <int, int>  ( 1, 20 ) );
   m1.insert ( pair <int, int>  ( 4, 40 ) );
   m1.insert ( pair <int, int>  ( 3, 60 ) );
   m1.insert ( pair <int, int>  ( 2, 50 ) );
   m1.insert ( pair <int, int>  ( 6, 40 ) );
   m1.insert ( pair <int, int>  ( 7, 30 ) );
 
   cout << "The original map m1 is:"<<endl;
   for ( m1_Iter = m1.begin( ); m1_Iter != m1.end( ); m1_Iter++ )
      cout <<  m1_Iter->first<<" "<<m1_Iter->second<<endl;
  
}

5、map的赋值加遍历

unordered_map<int, int> map;
for(int i=0;i<nums.size();i++)
    map[i]=nums[i];
unordered_map<int,int>::iterator iter;
for(iter=map.begin();iter!=map.end();iter++)
    cout<<iter->first<<' '<<iter->second<<endl; 

6、map的查找

// find 返回迭代器指向当前查找元素的位置否则返回map::end()位置
iter = mapname.find("102");
 
if(iter != mapname.end())
    cout<<"Find, the value is"<<iter->second<<endl;
else
    cout<<"Do not Find"<<endl;

7、map的基本操作函数
begin() 返回指向map头部的迭代器

clear() 删除所有元素

count() 返回指定元素出现的次数

empty() 如果map为空则返回true

end() 返回指向map末尾的迭代器

equal_range() 返回特殊条目的迭代器对

erase() 删除一个元素

find() 查找一个元素

get_allocator() 返回map的配置器

insert() 插入元素

key_comp() 返回比较元素key的函数

lower_bound() 返回键值>=给定元素的第一个位置

max_size() 返回可以容纳的最大元素个数

rbegin() 返回一个指向map尾部的逆向迭代器

rend() 返回一个指向map头部的逆向迭代器

size() 返回map中元素的个数

swap() 交换两个map

upper_bound() 返回键值>给定元素的第一个位置

value_comp() 返回比较元素value的函数

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!