STL——容器(Map & multimap)的插入与迭代器
1. 容器(Map & multimap)的插入
map.insert(...); //往容器插入元素,返回pair<iterator,bool>
map中插入元素的四种方式:
1 #include <iostream> 2 #include <map> 3 4 using namespace std; 5 6 int main() 7 { 8 map<int, string> mapStu; 9 10 //方法一: 构造一个 pair 然后插入 11 mapStu.insert(pair<int, string>(1, "内容A")); 12 13 //方法二: 使用 make_pair 14 mapStu.insert(make_pair(2, "内容B")); 15 16 //方法三: 使用 value_type, 相当于 pair<int,string> 17 mapStu.insert(map<int, string>::value_type(3, "内容C")); 18 19 //方法四: 使用下标插入,这种方法非常直观,但碰到相同的 key 时会进行覆盖操作 20 mapStu[4] = "内容D"; 21 22 //只要创建了 key ,这种情况会构造创建内存,生成 string 的默认空值,创建完右值后,拷贝给左值 23 mapStu[6] = mapStu[5]; 24 25 //将 key 为4的内容拷贝至7 26 mapStu[7] = mapStu[4]; 27 28 for (map<int, string>::iterator it = mapStu.begin(); it != mapStu.end(); it++) 29 { 30 cout << "key: " << (*it).first << " value: " << (*it).second << endl; 31 } 32 33 return 0; 34 }
打印结果:
1. 前三种方法,采用的是insert()方法,该方法返回值为pair<iterator, bool>
2. 第四种方法非常直观,但碰到相同的键时会进行覆盖操作。比如插入key 为4的键值时,先在mapStu中查找主键为4的项,若不存在,则将一个键为4,值为默认初始化值的对组插入到 mapStu 中,然后再将值修改成“内容D”。若发现已存在4这个键,则修改这个键对应的value。
3. string strName = mapStu[8]; //取值操作或插入操作
4. 只有当mapStu存在8这个键时才是正确的取操作,否则会自动插入一个实例,键为8,值为默认构造时的初始化值。
5. 在 key 值存在的情况下, 只有通过下标方式可以覆盖修改 key 对应的value (插入成功), 通过 insert 方法则不会(插入失败).
2. 使用 insert 插入返回 pair<iterator,bool>
下边例子用返回的打印判断插入是否成功:
1 #include <iostream> 2 #include <map> 3 4 using namespace std; 5 6 int main() 7 { 8 map<int, string> mapStu; 9 10 //方法一: 构造一个 pair 然后插入, 11 pair <map<int, string>::iterator, bool> ret_1 = mapStu.insert(pair<int, string>(1, "内容A")); 12 if (ret_1.second == true) 13 { 14 cout << "插入" << (*(ret_1.first)).second<< "成功" << endl; 15 } 16 else 17 { 18 cout << "插入" << "内容A新" << "失败" << endl; 19 } 20 pair <map<int, string>::iterator, bool> ret_2 = mapStu.insert(pair<int, string>(1, "内容A新")); 21 if (ret_2.second == true) 22 { 23 cout << "插入" << (*(ret_2.first)).second << "成功" << endl; 24 } 25 else 26 { 27 cout << "插入" << "内容A新" << "失败" << endl; 28 } 29 30 //方法二: 使用 make_pair 31 pair <map<int, string>::iterator, bool> ret_3 = mapStu.insert(make_pair(2, "内容B")); 32 if (ret_3.second == true) 33 { 34 cout << "插入" << (*(ret_3.first)).second << "成功" << endl; 35 } 36 else 37 { 38 cout << "插入" << "内容B新" << "失败" << endl; 39 } 40 pair <map<int, string>::iterator, bool> ret_4 = mapStu.insert(make_pair(2, "内容B新")); 41 if (ret_4.second == true) 42 { 43 cout << "插入" << (*(ret_4.first)).second << "成功" << endl; 44 } 45 else 46 { 47 cout << "插入" << "内容B新" << "失败" << endl; 48 } 49 50 //方法三: 使用 value_type, 相当于 pair<int,string> 51 pair<map<int, string>::iterator, bool> ret_5 = mapStu.insert(map<int, string>::value_type(3, "内容C")); 52 if (ret_5.second == true) 53 { 54 cout << "插入" << (*(ret_5.first)).second << "成功" << endl; 55 } 56 else 57 { 58 cout << "插入" << "内容C新" << "失败" << endl; 59 } 60 pair<map<int, string>::iterator, bool> ret_6 = mapStu.insert(map<int, string>::value_type(3, "内容C新")); 61 if (ret_6.second == true) 62 { 63 cout << "插入" << (*(ret_6.first)).second << "成功" << endl; 64 } 65 else 66 { 67 cout << "插入" << "内容C新" << "失败" << endl; 68 } 69 70 for (map<int, string>::iterator it = mapStu.begin(); it != mapStu.end(); it++) 71 { 72 cout << "key: " << (*it).first << " value: " << (*it).second << endl; 73 } 74 75 return 0; 76 }
打印结果:
3. 容器(Map & multimap)的迭代器
² map.begin(); //返回容器中第一个数据的迭代器。
² map.end(); //返回容器中最后一个数据之后的迭代器。
² map.rbegin(); //返回容器中倒数第一个元素的迭代器。
² map.rend(); //返回容器中倒数最后一个元素的后面的迭代器。
==========================================================================================================================