C++STL容器 – std::map查找元素与判断键值是否存在方法总结 count,find,contains,equal_range,lower_bound,upper_bound
本文将对容器std::map如何查找元素与判断键值是否存在的方法进行总结。
1 std::map查找元素
1.1 count
count函数的作用主要是返回在std::map中指定键值的数量,因为std::map的键值不可重复,所以如果std::map存在指定键值,则返回1,如果std::map中不存在指定键值,则返回0。
#include <iostream>
#include <map>
#include <string>
#include <iomanip>
void PrintMap(const std::map<int, std::string>& inMap)
{
std::map<int, std::string>::const_iterator const_iter = inMap.begin();
while (const_iter != inMap.end())
{
std::cout << const_iter->first << " " << const_iter->second << std::endl;
const_iter++;
}
}
int main()
{
std::cout << "original map:" << std::endl;
std::map<int, std::string> myMap;
for (int i = 0; i < 5; ++i)
{
myMap[i] = std::to_string(i);
}
PrintMap(myMap);
if (myMap.count(1))
{
std::cout << "该容器包含指定键值" << std::endl;
}
else
{
std::cout << "该容器不包含指定键值" << std::endl;
}
return 0;
}
结果:
original map:
0 0
1 1
2 2
3 3
4 4
该容器包含指定键值
1.2 find
find函数的作用主要是在容器std::map中查找指定键值的元素,如果该键值在容器中存在,则返回该元素的迭代器,如果该键值在容器中不存在,则返回指向容器end末尾的迭代器。
#include <iostream>
#include <map>
#include <string>
#include <iomanip>
void PrintMap(const std::map<int, std::string>& inMap)
{
std::map<int, std::string>::const_iterator const_iter = inMap.begin();
while (const_iter != inMap.end())
{
std::cout << const_iter->first << " " << const_iter->second << std::endl;
const_iter++;
}
}
int main()
{
std::cout << "original map:" << std::endl;
std::map<int, std::string> myMap;
for (int i = 0; i < 5; ++i)
{
myMap[i] = std::to_string(i);
}
PrintMap(myMap);
std::map<int, std::string>::iterator iter = myMap.find(1);
if (iter != myMap.end())
{
std::cout << "该容器包含指定键值" << std::endl;
}
else
{
std::cout << "该容器不包含指定键值" << std::endl;
}
return 0;
}
结果:
original map:
0 0
1 1
2 2
3 3
4 4
该容器包含指定键值
1.3 contains(C++20)
contains函数的作用主要是在容器std::map中查找指定键值的元素,如果容器中存在该键值的元素,则返回true,如果容器不存在该键值的元素,则返回false。
#include <iostream>
#include <map>
#include <string>
#include <iomanip>
void PrintMap(const std::map<int, std::string>& inMap)
{
std::map<int, std::string>::const_iterator const_iter = inMap.begin();
while (const_iter != inMap.end())
{
std::cout << const_iter->first << " " << const_iter->second << std::endl;
const_iter++;
}
}
int main()
{
std::cout << "original map:" << std::endl;
std::map<int, std::string> myMap;
for (int i = 0; i < 5; ++i)
{
myMap[i] = std::to_string(i);
}
PrintMap(myMap);
if (myMap.contains(1))
{
std::cout << "该容器包含指定键值" << std::endl;
}
else
{
std::cout << "该容器不包含指定键值" << std::endl;
}
return 0;
}
结果:
original map:
0 0
1 1
2 2
3 3
4 4
该容器包含指定键值
1.4 equal_rang
equal_range函数的作用主要是根据键值,返回一对迭代器的std::pair对象。如果该键值在容器中存在,则std::pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一位置。如果找不到匹配的元素,则pair对象中的两个迭代器都将指向此键应该插入的位置。总之,equal_range返回迭代器位置区间 [ lower_bound, upper_bound ) 。
#include <iostream>
#include <map>
#include <string>
#include <iomanip>
void PrintMap(const std::map<int, std::string>& inMap)
{
std::map<int, std::string>::const_iterator const_iter = inMap.begin();
while (const_iter != inMap.end())
{
std::cout << const_iter->first << " " << const_iter->second << std::endl;
const_iter++;
}
}
int main()
{
std::cout << "original map:" << std::endl;
std::map<int, std::string> myMap;
for (int i = 0; i < 5; ++i)
{
myMap[i] = std::to_string(i);
}
PrintMap(myMap);
std::pair<std::map<int, std::string>::iterator, std::map<int, std::string>::iterator> result = myMap.equal_range(1);
for (std::map<int, std::string>::iterator iter = result.first; iter != result.second; iter++)
{
std::cout << "m[" << iter->first << "] = " << iter->second << std::endl;
}
return 0;
}
结果:
original map:
0 0
1 1
2 2
3 3
4 4
m[1] = 1
另一个例子:
#include <iostream>
#include <map>
int main ()
{
std::multimap<char,int> my_multimap;
my_multimap.insert(std::make_pair('a',10));
my_multimap.insert(std::make_pair('a',20));
my_multimap.insert(std::make_pair('a',30));
my_multimap.insert(std::make_pair('a',40));
my_multimap.insert(std::make_pair('b',10));
my_multimap.insert(std::make_pair('c',10));
my_multimap.insert(std::make_pair('c',20));
std::cout << my_multimap.size() << std::endl;
std::pair<std::multimap<char,int>::iterator,std::multimap<char,int>::iterator> ret;
ret=my_multimap.equal_range('a');
for(std::multimap<char,int>::iterator it=ret.first;it !=ret.second;it++){
std::cout << it->first << " => " << it->second << '\n';
}
return 0;
}
结果:
7
a => 10
a => 20
a => 30
a => 40
1.5 lower_bound
lower_bound函数的作用主要是返回std::map容器中第一个不小于(即大于或者等于)指定key值元素的迭代器。如果没有找到这种元素,则返回容器尾部的迭代器,即std::map::end()。
#include <iostream>
#include <map>
#include <string>
#include <iomanip>
void PrintMap(const std::map<int, std::string>& inMap)
{
std::map<int, std::string>::const_iterator const_iter = inMap.begin();
while (const_iter != inMap.end())
{
std::cout << const_iter->first << " " << const_iter->second << std::endl;
const_iter++;
}
}
int main()
{
std::cout << "original map:" << std::endl;
std::map<int, std::string> myMap;
for (int i = 0; i < 5; ++i)
{
myMap[i] = std::to_string(i);
}
PrintMap(myMap);
std::map<int, std::string>::iterator iter = myMap.lower_bound(1);
if (iter != myMap.end())
{
std::cout <<"第一个不小于指定key的元素为:" << iter->first << " " << iter->second << std::endl;
}
return 0;
}
结果:
original map:
0 0
1 1
2 2
3 3
4 4
第一个不小于指定key的元素为:1 1
1.6 upper_bound
upper_bound函数的作用主要是返回std::map容器中第一个大于指定key值元素的迭代器。如果没有找到这种元素,则返回容器尾部的迭代器,即std::map::end()。
#include <iostream>
#include <map>
#include <string>
#include <iomanip>
void PrintMap(const std::map<int, std::string>& inMap)
{
std::map<int, std::string>::const_iterator const_iter = inMap.begin();
while (const_iter != inMap.end())
{
std::cout << const_iter->first << " " << const_iter->second << std::endl;
const_iter++;
}
}
int main()
{
std::cout << "original map:" << std::endl;
std::map<int, std::string> myMap;
for (int i = 0; i < 5; ++i)
{
myMap[i] = std::to_string(i);
}
PrintMap(myMap);
std::map<int, std::string>::iterator iter = myMap.upper_bound(1);
if (iter != myMap.end())
{
std::cout <<"第一个不小于指定key的元素为:" << iter->first << " " << iter->second << std::endl;
}
return 0;
}
结果:
original map:
0 0
1 1
2 2
3 3
4 4
第一个不小于指定key的元素为:2 2
本文作者:StubbornHuang
版权声明:本文为站长原创文章,如果转载请注明原文链接!
原文标题:C++STL容器 – std::map查找元素与判断键值是否存在方法总结 count,find,contains,equal_range,lower_bound,upper_bound
原文链接:https://www.stubbornhuang.com/1993/
发布于:2022年03月02日 10:17:25
修改于:2023年06月26日 20:32:37
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
评论
50