map是stl提供的一个关联容器,提供一对一的数据处理能力。第一个值为关键字,在map中只能出现一次,第二个值为关键字的值。map内部自建一颗红黑树,具有自动排序的功能。不管你以什么顺序插入值,map会按照关键字key的大小进行自动排序。
1.map的构造
map<int,string> mapStudent;
2.map的插入
共有3种插入方法:
(1).insert + pair
mapStudent.insert(pair<int, string>("1, student_1"));
(2).insert + valuetype
mapStudent.insert(map<int, string>::valuetype("2, student_2"));
(3).数组
mapStudent[3] = "student_3";
区别:前2种方法是相同的,在map中已经有该key的情况下,会插入失败,需要校验返回值;第3中方法在map中已经有该key的情况下,以覆盖写的形式插入。
前2种方法的插入校验:
pair<map<int, string>::iterator, bool> pairInsert;
pairInsert = mapStudent.insert(pair<int, string>("2, student_5"));
if(true == pairInsert.second)
{
cout << "Insert success." << endl;
}
3.map的遍历
(1).前向遍历器 iterator
for(map<int, string>::iterator iter = mapStudent.begin(); iter != mapStudent.end(); iter++ )
{
cout << iter->first << " " << iter->second << endl;
}
(2).反向遍历器 reverse_iterator
for(map<int, string>::reverse_iterator riter = mapStudent.rbegin(); riter!= mapStudent.rend(); riter++)
{
cout << riter->first << " " << iter->second << endl;
}
4.map的大小
int nSize = mapStudent.size();
5.map的查找
map<int, string>::iterator fiter = mapStudent.find(1);
6.map是否为空
mapStudent.empty();
7.map的数据删除
同样有3种删除方法:
(1).通过迭代器删除1个
mapStudent.erase(iter);
(2).通过key
mapStudent.erase(2);
(3).通过迭代器删除一片[begin, end)
mapStudent.erase(mapStudent.begin(), mapStudent.end());
测试代码如下:
#include<map> #include<string> #include<iostream> using namespace std; int main() { map<int,string> mapStudent; //插入方式1: insert + pair mapStudent.insert(pair<int, string>(1, "student_1")); //插入方式2: insert + valuetype mapStudent.insert(map<int, string>::value_type(2, "student_2")); //插入方式3: 数组方式 mapStudent[3] = "student_3"; mapStudent[5] = "student_5"; mapStudent[6] = "student_6"; mapStudent[4] = "student_4"; //区别:前2种插入方式相同,在已有key的情况下,再次插入相同key会失败;而方式3会以覆盖写的方式插入。 //方式3覆盖写 mapStudent[1] = "student_4"; //方式1/2 插入失败 pair<map<int, string>::iterator, bool> pairInsert; pairInsert = mapStudent.insert(pair<int, string>(2, "student_5")); if(true == pairInsert.second) { cout << "Method 1/2 overwrite insert success." << endl; } else { cout << "Method 1/2 overwrite insert fail." << endl; } //前向迭代器遍历 for(map<int, string>::iterator iter = mapStudent.begin(); iter != mapStudent.end(); iter++) { cout << iter->first << " " << iter->second << endl; } //反向迭代器遍历 cout << endl << "reverse_iterator:" << endl; for(map<int, string>::reverse_iterator riter = mapStudent.rbegin(); riter != mapStudent.rend(); riter++) { cout << riter->first << " " << riter->second << endl; } //map大小 int nSize = mapStudent.size(); cout << endl << "mapStuent size is " << nSize << endl; //map查找 map<int, string>::iterator finditer = mapStudent.find(1); if(finditer != mapStudent.end()) { cout << endl << "key=1 find value is " << finditer->second << endl; } //map删除1:迭代器 map<int, string>::iterator eraseiter = mapStudent.find(1); if(eraseiter != mapStudent.end()) { mapStudent.erase(eraseiter); } //map删除2:通过key mapStudent.erase(2); for(map<int, string>::iterator niter = mapStudent.begin(); niter != mapStudent.end(); niter++) { cout << niter->first << " " << niter->second << endl; } //map删除3:[begin, end) mapStudent.erase(mapStudent.begin(), mapStudent.end()); //map是否为空 if(mapStudent.empty()) { cout << "mapStudent is empty." << endl; } return 0; }
执行结果如下: