1、std::pair是二元组类模板,就是表示两种相互关联的事物,第一个叫做键,第二个叫做值,一个pair对象称为一个键值对。pair对象有两个变量,分别是first和second,调用first可以获取pair的键,调用second可以获取pair键所对应的值。我们既可以直接定义一个pair对象,也可以使用make_pair函数创建一个pair:
std::pair<char, int> a( 'a', 97 ); make_pair( 'a', 97 );
2、map通俗的说就是一个二元组集合,里面存放的是pair这种二元组,但集合中任意两个pair的键是不能相同的。我们既可以通过map获取某个键所对应的值(通过下标的方式,其中键作为下标的索引),也可以通过pair来获取(pair->first = 键;pair->second = 值)。对于map的迭代器(iterator),对其解引用后,就是一个pair对象,所以iterator->first = 键、iterator->second = 值。
3、下面以一个例子来说明map和pair的定义、插入、以及键和值的获取等操作。
// map.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <iostream> #include <map> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { map<int,string> map1;//map的定义1 map1[1] = "beijing"; //通过下标插入值 map1[2] = "shanghai"; map1[3] = "tianjin"; map1[4] = "chengde"; map1[5] = "baoding"; //通过下标输出 cout<<map1[1].c_str()<<" "<<map1[2].c_str()<<" "<<map1[3].c_str()<<" "<<map1[4].c_str()<<" "<<map1[5].c_str()<<endl; //通过迭代器输出,迭代器解引用是一个pair类型的对象, //即迭代器是指向pair类型的指针 map<int,string>::iterator iter = map1.begin();//map类型迭代器 for (;iter != map1.end();iter++) { cout<<(iter->second).c_str()<<" "; } cout<<endl; cout<<"----------------------------------------------------------------------"<<endl; map<int,string> map2(map1);//map的定义2 //通过insert插入值,插入的是pair类型值 map2.insert(map<int,string>::value_type(6,"shijiazhuang")); map2.insert(make_pair(7,"tangshan")); pair<int,string> p(8,"zhangjiakou"); map2.insert(p); typedef map<int,string>::value_type pairType; map2.insert(pairType(9,"langfang")); map<int,string>::iterator iter2 = map2.begin();//map类型迭代器 for (;iter2 != map2.end();iter2++) { cout<<(iter2->second).c_str()<<" "; } cout<<endl; cout<<"----------------------------------------------------------------------"<<endl; map<int,string>::iterator iter3 = map2.begin(); map<int,string>::iterator iter4 = map2.find(7); map<int,string> map3(iter3,iter4);//map的定义3 pair<map<int,string>::iterator,bool> ret = map3.insert(make_pair(4,"cangzhou")); if (ret.second) { cout<<"insert cang zhou success"<<endl; } else{ cout<<"insert cang zhou error"<<"---"; cout<<"相应键已经存在,其值为:"<<(ret.first->second).c_str()<<endl; } pair<map<int,string>::iterator,bool> ret1 = map3.insert(make_pair(10,"handan")); if (ret1.second) { cout<<"insert handan success"<<endl; } else{ cout<<"insert handan error"<<"---"; cout<<"相应键已经存在,其值为:"<<(ret1.first->second).c_str()<<endl; } map<int,string>::iterator iter5 = map3.begin(); for (;iter5 != map3.end();iter5++) { cout<<(iter5->second).c_str()<<" "; } cout<<endl; return 0; }