Fork me on GitHub

STL——容器(Map & multimap)的查找

  • map.find(key);   //查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回map.end();
  • map.count(key);   //返回容器中键值为key的对组个数。对map来说,要么是0,要么是1;对multimap来说,值>=0。
  • map.lower_bound(keyElem);  //返回第一个key>=keyElem元素的迭代器。
  • map.upper_bound(keyElem);    //  返回第一个key>keyElem元素的迭代器。
  • map.equal_range(keyElem);     //返回容器中key与keyEl相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)。

1. map.find(key);

find(); 的所有返回值均为 key 的 iterator 类型迭代器

代码示例:

 1 #include <iostream>
 2 #include <map>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     map<int, string> mapStu1;
 9 
10     mapStu1.insert(pair<int, string>(1, "内容A"));
11     mapStu1.insert(pair<int, string>(2, "内容B"));
12     mapStu1.insert(pair<int, string>(3, "内容C"));
13     mapStu1.insert(pair<int, string>(4, "内容D"));
14     mapStu1.insert(pair<int, string>(5, "内容E"));
15 
16     map<int, string>::iterator it_1 = mapStu1.find(3);        //将返回值赋值给 iterator 类型的 it
17 
18     if (it_1 != mapStu1.end())                                //由于 find 为全部遍历,如果没有找到元素, 会返回 end()
19     {
20         cout << "key值: " << it_1->first << " 对应的velue为:" << it_1->second << endl;
21     }
22     else
23     {
24         cout << "没有找到对应的" << it_1->first << endl;
25     }
26 
27     map<int, string>::iterator it_2 = mapStu1.find(6);
28     
29     if (it_2 != mapStu1.end())
30     {
31         cout << "key值: " << it_2->first << " 对应的velue为:" << it_2->second << endl;
32     }
33     else
34     {
35         cout << "没有找到对应的key" << endl;
36     }
37 
38     return 0;
39 }

打印结果:

由于 map 的 key具有唯一性, multimap 这种具有多个相同的 key 如何解决, 示例代码如下:

 1 #include <iostream>
 2 #include <map>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     multimap<int, string> multimapStu1;
 9 
10     multimapStu1.insert(pair<int, string>(1, "内容A"));
11     multimapStu1.insert(pair<int, string>(2, "内容B"));
12     multimapStu1.insert(pair<int, string>(3, "内容C"));
13     multimapStu1.insert(pair<int, string>(3, "内容D"));
14     multimapStu1.insert(pair<int, string>(3, "内容E"));
15     multimapStu1.insert(pair<int, string>(4, "内容F"));
16     
17     map<int, string>::iterator it_1 = multimapStu1.find(3);        //将返回值赋值给 iterator 类型的 it
18 
19     if (it_1 != multimapStu1.end())
20     {
21         for (; it_1 != multimapStu1.end(); it_1++)
22         {
23             if (it_1->first == 3)
24             {
25                 cout << "key值: " << it_1->first << " 对应的velue为:" << it_1->second << endl;
26             }
27         }
28     }
29 
30     return 0;
31 }

打印结果:

 

 

2. map.count(key);

统计拥有 key 的数量, 示例代码如下:

 1 #include <iostream>
 2 #include <map>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     multimap<int, string> multimapStu1;
 9 
10     multimapStu1.insert(pair<int, string>(1, "内容A"));
11     multimapStu1.insert(pair<int, string>(2, "内容B"));
12     multimapStu1.insert(pair<int, string>(3, "内容C"));
13     multimapStu1.insert(pair<int, string>(3, "内容D"));
14     multimapStu1.insert(pair<int, string>(3, "内容E"));
15     
16     map<int, string>::iterator it_1 = multimapStu1.find(3);
17 
18     int count = multimapStu1.count(3);
19     cout << "找到" << count << "个相关元素" << endl;
20 
21     if (it_1 != multimapStu1.end())
22     {
23         for (int i = 0; i < count; i++)
24         {
25             cout << "key值: " << it_1->first << " 对应的velue为:" << it_1->second << endl;
26         }
27     }
28     else
29     {
30         cout << "没找到" << endl;
31     }
32 
33     return 0;
34 }

打印结果:

 

 

3. map.lower_bound(keyElem);

 返回第一个key>=keyElem元素的迭代器,示例代码如下:

 1 #include <iostream>
 2 #include <map>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     multimap<int, string> multimapStu1;
 9 
10     multimapStu1.insert(pair<int, string>(1, "内容A"));
11     multimapStu1.insert(pair<int, string>(2, "内容B"));
12     multimapStu1.insert(pair<int, string>(3, "内容C"));
13     multimapStu1.insert(pair<int, string>(4, "内容D"));
14     multimapStu1.insert(pair<int, string>(4, "内容DD"));
15     multimapStu1.insert(pair<int, string>(4, "内容DDD"));
16     multimapStu1.insert(pair<int, string>(5, "内容E"));
17 
18     //map<int, string>::iterator it_1 = multimapStu1.lower_bound(4);
19 
20     cout << "输出 key 值大等于4以后的内容" << endl;
21 
22     for (map<int, string>::iterator it = multimapStu1.lower_bound(3); it != multimapStu1.end(); it++)
23     {
24         if (it->first == 4)
25         {
26             cout << "第一个 key 为:" << it->first << "  其内容为:" << it->second << endl;
27         }
28     }
29 
30     return 0;
31 }

打印结果:

 

 

4. map.upper_bound(keyElem);

返回第一个key>keyElem元素的迭代器,代码示例:

 1 #include <iostream>
 2 #include <map>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     multimap<int, string> multimapStu1;
 9 
10     multimapStu1.insert(pair<int, string>(1, "内容A"));
11     multimapStu1.insert(pair<int, string>(2, "内容B"));
12     multimapStu1.insert(pair<int, string>(3, "内容C"));
13     multimapStu1.insert(pair<int, string>(4, "内容D"));
14     multimapStu1.insert(pair<int, string>(4, "内容DD"));
15     multimapStu1.insert(pair<int, string>(4, "内容DDD"));
16     multimapStu1.insert(pair<int, string>(5, "内容E"));
17 
18     cout << "输出 key 值大等于4以后的内容" << endl;
19 
20     for (map<int, string>::iterator it = multimapStu1.upper_bound(3); it != multimapStu1.end(); it++)
21     {
22         if (it->first == 4)
23         {
24             cout << "第一个 key 为:" << it->first << "  其内容为:" << it->second << endl;
25         }
26     }
27 
28     return 0;
29 }

打印结果:

 

 

 

5. map.equal_range(keyElem);

返回容器中key与keyElem相等的上下限的两个迭代器。上限是闭区间,下限是开区间,如[beg,end)。代码如下:

 1 #include <iostream>
 2 #include <map>
 3 
 4 using namespace std;
 5 
 6 int main()
 7 {
 8     multimap<int, string> multimapStu1;
 9 
10     multimapStu1.insert(pair<int, string>(1, "内容A"));
11     multimapStu1.insert(pair<int, string>(2, "内容B"));
12     multimapStu1.insert(pair<int, string>(3, "内容C"));
13     multimapStu1.insert(pair<int, string>(3, "内容CC"));
14     multimapStu1.insert(pair<int, string>(3, "内容CCC"));
15     multimapStu1.insert(pair<int, string>(4, "内容D"));
16 
17     cout << "输出 key 与 keyElem 相等的上下限的两个迭代器" << endl;
18 
19     pair<multimap<int, string>::iterator, multimap<int, string>::iterator> mmit = multimapStu1.equal_range(3);
20 
21     if (mmit.first != multimapStu1.end())
22     {
23         cout << "第一个迭代器的 key 为:" << (*mmit.first).first << "  其内容为:" << (*mmit.first).second << endl;
24     }
25 
26     if (mmit.second != multimapStu1.end())
27     {
28         cout << "第二个迭代器的 key 为:" << (*mmit.second).first << "  其内容为:" << (*mmit.second).second << endl;
29     }
30 
31     return 0;
32 }

打印结果:

 

 

 

 

 

 

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

 

posted @ 2020-06-16 01:54  索智源  阅读(460)  评论(0编辑  收藏  举报