map相关容器

map/multimap

基本概念

简介:
在大量的数据中快速定位,

  • map中所有元素都是pair(成对出现的),所有元素都会根据元素的键值自动排序
  • pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
  • 新增或删除操作,操作之前的迭代器仍然有效,除被删除的

为什么体现有序性:

map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。

本质:

  • map/multimap属于关联式容器,底层结构是用红黑树实现。

优点:

  • 可以根据key值快速找到value值

map和multimap区别

  • map不允许容器中有重复key值元素
  • multimap允许容器中有重复key值元素

map构造和赋值

函数原型:

构造:

  • map<T1, T2> mp; //map默认构造函数:
  • map(const map &mp); //拷贝构造函数
  • map (InputIterator first, InputIterator last, const allocator_type& = allocator_type()); //范围构造函数

赋值:

  • map& operator=(const map &mp); //重载等号操作符

示例:

// 这里选取c++ reference 的例子
#include <iostream>
#include <map>

bool fncomp (char lhs, char rhs) {return lhs<rhs;}

struct classcomp {
  bool operator() (const char& lhs, const char& rhs) const
  {return lhs<rhs;}
};

int main ()
{
  std::map<char,int> first;    // 默认构造函数

  first['a']=10;
  first['b']=30;
  first['c']=50;
  first['d']=70;  // 创建一些对

  std::map<char,int> second (first.begin(),first.end());  // 范围构造函数

  std::map<char,int> third (second);  // 复制构造函数

  std::map<char,int,classcomp> fourth;                 // class as Compare

  bool(*fn_pt)(char,char) = fncomp;
  std::map<char,int,bool(*)(char,char)> fifth (fn_pt); // function pointer as Compare

  return 0;
}

map大小和交换

函数原型:

  • size(); //返回容器中元素的数目
  • empty(); //判断容器是否为空
  • swap(st); //交换两个集合容器

示例:

#include <map>

map<int, int>m;
m.empty();

map<int, int>m2;
m.swap(m2);

map插入和删除

函数原型:

  • insert(elem); //在容器中插入元素。
  • clear(); //清除所有元素
  • erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
  • erase(beg, end); //删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
  • erase(key); //删除容器中值为key的元素。

示例:

#include <map>

map<int, int> m;
//插入
m.insert(pair<int, int>(1, 10));	//第一种插入方式,一个对组
m.insert(make_pair(2, 20));		//第二种插入方式,制造对组
m.insert(map<int, int>::value_type(3, 30));	//第三种插入方式,不常用,写个值类型
m[4] = 40; 	//第四种插入方式,重载运算符,不建议,如果没有,会凭空创建一个没有的队组

//删除
m.erase(m.begin());
m.erase(3);

//清空
m.erase(m.begin(),m.end());
m.clear();

map查找和统计

函数原型:

  • find(key); //查找key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
  • count(key); //统计key的元素个数

示例:

#include <map>

//查找
map<int, int>::iterator pos = m.find(3);	//返回的是map的迭代器

//统计
int num = m.count(3);	//结果要么1要么0,因为是map,不允许插入重复的

和unordered对比

基本概念

unordered_map/unordered_multimap是C++11中新出的关联式容器。

区别分析

它们功能基本类似,最主要就是底层结构不同,使用场景不同。

1.头文件包含

需要引入的头文件不同

  • map:#include < map >
  • unordered_map:#include < unordered_map >
2.内部实现机理不同
  • map: 底层为红黑树查找大致为logN的时间复杂度
  • unordered_map: 底层是闭散列的哈希桶,查找为O(1),性能更优
3.优缺点以及适用处

map

优点:

  • 有序性,,最大的优点

缺点:

  • 空间占用率高,考虑红黑树的问题

适用处:

  • 对于那些有顺序要求的问题,用map会更高效一些

unordered_map:

优点:

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

缺点:

  • 哈希表的建立比较耗费时间
  • 通过元素的子集范围迭代效率低

适用处:

  • 遇到查找问题,常会考虑一下用unordered_map,更高效

总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值