1、map的特性
map的特性是所有元素都会根据元素的键值自动被排序,map的所有元素都是一对的(pair),同时拥有实值(value)和键值(key)。pair中的第一个元素被看作键值,第二个元素被看做实值,且map不允许两个元素拥有相同的键值。
map和list拥有相同的某些性质,当它对容器元素进行添加或删除时,操作之前的所有迭代器在操作完成值后依然有效。
2、map的初始化
map<key,value>arr; //创建一个名为arr的空的map,其键值和实值为key和value
map<key,value>arr(arr2); //创建arr2的副本arr,arr和arr2必须有相同的键类型和值类型
map<key,value>arr(a,b); //创建map类型的对象arr,存储迭代器a和b标记的范围内所有元素的副本,元素的类型必须能转换为pair
map<key,value,comp>arr; //comp可选,为键值对的存放策略,即键的比较函数,默认标准库使用键类型定义的<操作符来实现键的比较。所用的比较函数必须在键类型上定义严格的弱排序,可将其理解为键类型数据上的“小于关系”。在实际应用中,键类型必须能定义<操作符。对于键,其唯一的约束就是必须支持<操作符。
3、map的相关操作
1.插入
arr.insert(e);
e是一个用在arr上的value类型的值。如果e.first不在arr中,则,插入一个值为e.second的新元素;如果该键在arr中已存在,那么不进行任何操作。该函数返回一个pair类型对象,包含指向键为e.first的元素map的迭代器,以及一个bool类型的对象,表示是否插入了该元素。
arr.insert(beg,end);
beg,end是标记元素范围的迭代器,对于该范围内的所有元素,如果它的键在arr中不存在,则将该键及其关联的值插入到arr。返回void类型。
arr.insert(iter,e);
e是value类型的值,如果e.first不在arr中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置,返回下一个迭代器,指向arr中具有给定键的元素。在添加新的map元素时,使用insert成员可避免使用下标操作符带来的副作用,即不必要的初始化。
插入元素的方式有三种:
通过pair的方式插入对象
arr.insert(pair<int,string>(3,"小张"));或arr.insert(make_pair(-1,"小王"));
通过value_type的方式插入对象
arr.insert(map<int,string>::value_type(1,"小李"));
通过数组的方式插入
arr[4]="小刘";
2.删除
arr.clear(); //删除所有元素
arr.erase(pos); //删除pos所指的元素,返回下一个元素的迭代器
arr.erase(beg,end); //删除区间[beg,end)的所有元素,返回下一个元素的迭代器
arr.erase(keyelem); //删除容器中key为keyelem的组对
3.查找
arr.find(key); //查找键值key是否存在,存在返回该键的元素的迭代器,不存在返回map.end()
arr.count(keyelem); //返回容器中key为keyelem的对组的个数,对于map来说要么是0要么是1
arr.lower_bound(keyelem); //返回第一个key>=keyelem元素的迭代器
arr.upper_bound(keyelem); //返回第一个key>keyelem元素的迭代器
arr.equql_range(keyelem); //返回容器中key与keyelem相等的上下限的两个迭代器
4、map简单的实现
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
map<string,int>arr;
arr.insert(pair<string,int>("xiaozhang",1));
arr.insert(pair<string,int>("xiaowang",2));
arr[string("xiaoliu")]=3;
arr[string("xiaohu")]=4;
pair<string,int>value(string("xiaolei"),5);
arr.insert(value);
map<string,int>::iterator iter1=arr.begin();
for(;iter1!=arr.end();++iter1)
cout<<iter1->first<<' '<<iter1->second<<endl;
int num=arr[string("xiaowang")];
cout<<num<<endl;
map<string,int>::iterator iter2;
iter2=arr.find(string("xiaolei"));
if(iter2==arr.end())
cout<<"Not found!"<<endl;
else
cout<<"Is found!"<<endl;
iter2->second=7; //修改了value值
int num2=arr[string("xiaolei")];
cout<<num2<<endl;
iter2=arr.find(string("gkjjksj"));
if(iter2==arr.end())
cout<<"Not found!"<<endl;
else
cout<<"Is found!"<<endl;
}
5、multimap
multimap的特性以及用法与map完全相同,唯一的差别在于,multimap允许键值重复。
#include<iostream>
#include<map>
#include<string>
using namespace std;
int main()
{
multimap<string,int>arr;
arr.insert(pair<string,int>("xiaozhang",1));
arr.insert(pair<string,int>("xiaowang",2));
arr.insert(pair<string,int>("xiaozhang",6));
pair<string,int>value(string("xiaolei"),5);
arr.insert(value);
multimap<string,int>::iterator iter1;
iter1=arr.lower_bound("xiaozhang");
cout<<iter1->first<<" "<<iter1->second<<endl;
multimap<string,int>::iterator iter2;
iter2=arr.upper_bound("xiaowang");
cout<<iter2->first<<" "<<iter2->second<<endl;
int num=arr.count("xiaozhang");
cout<<num<<endl;
multimap<string,int>::iterator itbeg=arr.begin();
multimap<string,int>::iterator itend=arr.end();
arr.erase(itbeg,itend);
if(arr.empty())
{
cout<<"arr已空"<<endl;
}
}