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 }
打印结果:
==========================================================================================================================