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,更高效
总结: