map和multimap 及unordered_map
- 每个元素都是pair
- pair的第一个元素为key(键值) 起索引作用,第二个元素为value(实值)
- 所有元素都会根据元素的键值自动排序
- 优点:可以根据key值迅速找到value值
map键是唯一的,每个键都对应一个值;
mulltmap允许容器中有多个重复的key值。
使用二者时需引入头文件#include<map>.
map的迭代器为双向访问,不支持随机访问,执行一次++或--的时间复杂度为O(logn).
- size()/empty()/clear() 元素个数、判空、清空
- begin()/end() 开始位置和结束位置
- rbegin() 最后一个元素的位置
- 四种插入方式,见下
- erase(key) 删除所有键为key的元素
- erase(it) 删除it迭代器指向的元素,返回下一个元素的迭代器
- erase(deg,end) 删除区间[beg,end)的元素,返回下一个元素的迭代器
- find(key) 查找键key是否存在,若存在则返回迭代器,若不存在,返回m.end()
- count(key) 统计key的元素个数
- swap(st) 交换
构造、赋值、
map<string,int>a; //升序
map<string,int,greater<string> >b; //降序
a.insert(make_pair(s,i)); //可以使用make_pair生成一对数(键,值)进行插入
for(mao<string,int>::iterator it=a.begin();it!=a.end();it++)
cout<<it->first<<" "<<(*it).second<<endl;
map<string,int>c(a); //拷贝构造函数
map<string,int>d;
d=c; //赋值方式构造
可以通过[]直接对键所对应的值进行操作:
cout<<a[s]<<endl; //输出键为s(string类型)对应的值(int类型)
a[s]=5;
需要注意,如果查找的key不存在,则指向a[key]之后会自动新建一个二元组(key,0)并返回0,因此可能会建立很多无用的二元组,最好在a[key]之前先判断a.find(key)!=a.end()。
#include<iostream>
#include<map>
#include<string>
using namespace std;
class Person
{
public:
Person(string a,int b)
{
name=a;
age=b;
}
string name;
int age;
};
class Myclass
{
public:
bool operator()(const Person& a,const Person& b)
{
return a.age>b.age;
}
};
void print(const map<string,int>&s)//防止误改
{
for(map<string,int>::const_iterator it=s.begin();it!=s.end();it++)
{
cout<<it->first<<" "<<(*it).second<<endl;
}
cout<<endl<<endl;
}
int main()
{
map<string,int>m;
m.insert(pair<string,int>("张九九",20));
m.insert(make_pair("樊乂乂",17));
m.insert(map<string,int>::value_type("zx",19));
m["fmx"]=16;
cout<<m["123"]<<endl;//不建议用这种方法,因为如果没有这个pair,会新建一个
print(m);
m.erase(m.begin());
print(m);
m.erase("zx");
print(m);
return 0;
}
如果是自定义的数据类型,则需要写仿函数,详情见set那一节
multimap因为是一对多的关系,不能用[]
multimap<string,int> mp;
string s1("X"),s2("Y");
mp.insert(make_pair(s1,50));
mp.insert(make_pair(s1,55));
mp.insert(make_pair(s1,60));
mp.insert(make_pair(s2,30));
mp.insert(make_pair(s2,20));
mp.insert(make_pair(s1,10));
multimap<string,int>::iterator it;
it=mp.find(s1);
for(int k=0;k<mp.count(s1);k++,it++)
cout<<it->first<<" "<<it->second<<endl;
输出如下:
X 50
X 55
X 60
X 10
map: map内部实现了一个红黑树,该结构具备自动排序的功能,所以map内部的全部元素都是有序的,红黑树的每个节点都表明着map的一个元素,所以,对于map进行的查找,删除,添加等一系列的操做都至关因而对红黑树进行这样的操做,故红黑树的效率决定了map的效率。
unordered_map: unordered_map内部实现了一个哈希表,所以其元素的排列顺序是杂乱的,无序的