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
当前分类随机文章推荐
- C++ - 字节数组byte[]或者unsigned char[]与int的相互转换 阅读8510次,点赞2次
- C++ - 判断本机文件是否存在的方式总结 阅读6251次,点赞0次
- C++STL容器 - std::map容器修改、元素操作总结 clear,insert,emplace,erase,swap,merge,extract,insert_or_assign等 阅读2257次,点赞0次
- C++11/std::thread - 可作为线程函数的几种方式总结 阅读3908次,点赞1次
- C++ - std::map正向遍历与反向遍历的几种方式 阅读5200次,点赞3次
- C++ - 将std::vector中的数值拷贝到数组中 阅读3635次,点赞1次
- C++STL容器 - std::map查找元素与判断键值是否存在方法总结 count,find,contains,equal_range,lower_bound,upper_bound 阅读1270次,点赞0次
- C++ - return this和return *this的含义和区别 阅读664次,点赞0次
- C++ - std::vector初始化方式总结 阅读110次,点赞0次
- C++ - Windows系统使用C++切换音频默认输出设备 阅读86次,点赞0次
全站随机文章推荐
- C++ – 字节数组byte[]或者unsigned char[]与bool的相互转换 阅读1419次,点赞1次
- 资源分享 - 白话深度学习与TensorFlow PDF下载 阅读2503次,点赞1次
- WordPress - 后台登录成功/失败发送邮件给网站管理员 阅读3363次,点赞0次
- Youtube运营 - Youtube做哪些视频内容可以快速通过人工审核 阅读556次,点赞1次
- 资源分享 - Game Development Tools 英文高清PDF下载 阅读2308次,点赞0次
- C++11/std::thread - 可作为线程函数的几种方式总结 阅读3908次,点赞1次
- 资源分享 - Vector Analysis for Computer Graphics , Second Edition 英文高清PDF下载 阅读1371次,点赞0次
- 资源分享 - Game AI Pro - Collected Wisdom of Game AI Professionals 英文高清PDF下载 阅读2058次,点赞0次
- 姿态估计之COCO数据集骨骼关节keypoint标注对应 阅读11838次,点赞5次
- 资源分享 - Fundamentals of Computer Graphics, Fourth Edition高清英文PDF下载 阅读13593次,点赞8次
评论
169