**Map**是一个关联容器,它内部有两个数据,第一个(**first**)称为关键字(**key**),第二个(**second**)称为关键字的值(**value**),**key**与**value**二者是一一对应的(称为**pair**),且**key**在**map**中关键字是唯一的。**map**内部自建一颗严格意义上的平衡二叉树,对数据有排序功能,因此,**map**内部数据都是有排序的(**less**或**greater**)。
具体关于**map**容器类的介绍可以看这:[https://msdn.microsoft.com/en-us/library/s44w4h2s.aspx](https://msdn.microsoft.com/en-us/library/s44w4h2s.aspx)
下面来看看一些常用的方法:
**1、map::insert()**
~~~
map<string, int> student;
student.insert(pair<string, int>("xiaohong", 80));
student.insert(pair<string, int>("xiaofang", 76));//成功
student.insert(pair<string, int>("xiaoming", 94));
student.insert(pair<string, int>("xiaozhang", 80));//key不同,value可以相同
student.insert(pair<string, int>("xiaofang", 88));//存在为"xiaofang"的key,插入失效
~~~
实际上,**map**的**insert**比较简单,因此不论你怎么插,其内部的平衡二叉树都会根据关键字**key**自动排序。在上述代码中可知,**key**是**string**类型的,且是唯一的,插入重复的关键字的一对数据将会失效;虽然**key**唯一,但是**value**可以相同。(上面可以看作是学生的考试成绩,姓名(**key**)与成绩(**value**)一一对应)
**2、map::begin()、map::cbegin()、map::end()、map::cend()、**
**map::crbegin()、map::crend()、map::rbegin()、map::rend()**
这些就不说了。
**3、map::at()、map::iterator**(元素的访问)
~~~
map<string, int>::iterator it;
for (it = student.begin(); it != student.end(); ++it){
cout<<it->first<<" "<<it->second<<endl;
}
cout<<student.at("xiaoming")<<endl;
cout<<student.at("xiaozhang")<<endl;
~~~
实际上,关键字**key**存放在**map**中为**first**,关键字的值**value**在**map**中为**second**,使用的是迭代器来访问。
**at()**访问时,带入的参数是关键字,返回关键字所对应的值,上面的两个输出分别是:94、80。
**4、map::count()**
~~~
cout<<student.count("xiaohong")<<endl;//输出1
cout<<student.count("xiaoHong")<<endl;//输出0
~~~
这个方法是用来判断**map**中是否存在某个关键字。存在返回**1**,不存在返回**0**。
**5、map::find()**
~~~
map<string, int>::iterator it;
it = student.find("xiaoming");
cout<<it->first<<" "<<it->second<<endl;
~~~
查找,返回所查找关键字指向的迭代器。
**6、map::equal_range()**
~~~
pair<map<string, int>::iterator, map<string, int>::iterator> it;
it = student.equal_range("xiaoho");
cout<<it.first->first<<" "<<it.first->second<<endl;
cout<<it.second->first<<" "<<it.second->second<<endl;
~~~
返回一对迭代器。第一个迭代器指向的是**map**中第一个**大于key**的迭代器,第二个迭代器指向的是**map**中第一个**大于或等于key**的迭代器。
**7、map::erase()**
~~~
student.erase("xiaofang");//删除关键字为"xiaofang"的pair
student.erase(student.begin());//删除起始位置的pair
student.erase(next(student.begin()), prev(student.end()));//保留第一个和最后一个pair,其余的全部删除
~~~
删除某个**关键字**所关联的**pair of key-value**或某个**位置**或某个**连续位置**的**pair of key-value**。
**8、map::clear()、map::empty()、map::size()**
~~~
student.clear();
cout<<student.empty()<<endl;
cout<<student.size()<<endl;
~~~
**map::clear()**是删除**map**中的所有**pair**,**map::empty()**返回一个**bool**类型值,**true**表示空,**flase**表示非空,**map::size()**返回**map**中**pair**的个数。
**9、其他的用法**
~~~
vector<pair<string, int> >s;
s.push_back(make_pair("ads", 3));
s.push_back(make_pair("edf", 6));
s.push_back(make_pair("ifd", 9));
vector<pair<string, int>>::iterator iw;
for(iw = s.begin(); iw != s.end(); ++iw){
cout<<iw->first<<" "<<iw->second<<endl;
}
cout<<endl<<endl;
student.insert(s.begin(), s.end());
for (it = student.begin(); it != student.end(); ++it){
cout<<it->first<<" "<<it->second<<endl;
}
~~~
比如将**vector**转换成**map**来使用也是可以的。
当然,还有一些其他用法,用到的时候再查,这里就不介绍了。