Fork me on GitHub

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();   //返回容器中倒数最后一个元素的后面的迭代器。

 

 

 

 

 

==========================================================================================================================

posted @ 2020-06-14 21:51  索智源  阅读(413)  评论(0编辑  收藏  举报