Determine if map contains a value for a key?(确定映射是否包含键的值?)
问题描述
确定 STL 映射是否包含给定键的值的最佳方法是什么?
What is the best way to determine if a STL map contains a value for a given key?
#include <map>
using namespace std;
struct Bar
{
int i;
};
int main()
{
map<int, Bar> m;
Bar b = {0};
Bar b1 = {1};
m[0] = b;
m[1] = b1;
//Bar b2 = m[2];
map<int, Bar>::iterator iter = m.find(2);
Bar b3 = iter->second;
}
在调试器中检查这个,看起来 iter
只是垃圾数据.
Examining this in a debugger, it looks like iter
is just garbage data.
如果我取消注释这一行:
If I uncomment out this line:
Bar b2 = m[2]
调试器显示 b2
是 {i = 0}
.(我猜这意味着使用未定义的索引将返回一个包含所有空/未初始化值的结构?)
The debugger shows that b2
is {i = 0}
. (I'm guessing it means that using an undefined index will return a struct with all empty/uninitialized values?)
这些方法都不是很好.我真正想要的是这样的界面:
Neither of these methods is so great. What I'd really like is an interface like this:
bool getValue(int key, Bar& out)
{
if (map contains value for key)
{
out = map[key];
return true;
}
return false;
}
是否存在类似这样的东西?
Does something along these lines exist?
推荐答案
是否存在类似这样的东西?
Does something along these lines exist?
没有.使用 stl 映射类,您可以使用 ::find()
搜索地图,并将返回的迭代器与 std::map::end()
No. With the stl map class, you use ::find()
to search the map, and compare the returned iterator to std::map::end()
所以
map<int,Bar>::iterator it = m.find('2');
Bar b3;
if(it != m.end())
{
//element found;
b3 = it->second;
}
显然,如果您愿意,您可以编写自己的 getValue()
例程(同样在 C++ 中,没有理由使用 out
),但我怀疑一旦你掌握了使用 std::map::find()
的窍门,你不会想浪费时间.
Obviously you can write your own getValue()
routine if you want (also in C++, there is no reason to use out
), but I would suspect that once you get the hang of using std::map::find()
you won't want to waste your time.
还有你的代码有点错误:
m.find('2');
将在地图中搜索 '2'
的键值.IIRC C++ 编译器会将 '2' 隐式转换为 int,这会导致 '2' 的 ASCII 代码的数值不是您想要的.
m.find('2');
will search the map for a keyvalue that is '2'
. IIRC the C++ compiler will implicitly convert '2' to an int, which results in the numeric value for the ASCII code for '2' which is not what you want.
因为你在这个例子中的keytype是int
,你想这样搜索:m.find(2);
Since your keytype in this example is int
you want to search like this: m.find(2);
这篇关于确定映射是否包含键的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:确定映射是否包含键的值?
基础教程推荐
- 在 C++ 中循环遍历所有 Lua 全局变量 2021-01-01
- 管理共享内存应该分配多少内存?(助推) 2022-12-07
- 为 C/C++ 中的项目的 makefile 生成依赖项 2022-01-01
- 如何使图像调整大小以在 Qt 中缩放? 2021-01-01
- 为什么语句不能出现在命名空间范围内? 2021-01-01
- 从 std::cin 读取密码 2021-01-01
- Windows Media Foundation 录制音频 2021-01-01
- 使用从字符串中提取的参数调用函数 2022-01-01
- 如何“在 Finder 中显示"或“在资源管理器中显 2021-01-01
- 如何在不破坏 vtbl 的情况下做相当于 memset(this, ...) 的操作? 2022-01-01