C++ 检查映射c+中是否存在元素+;

C++ 检查映射c+中是否存在元素+;,c++,dictionary,find,key,C++,Dictionary,Find,Key,是否有任何函数可以查找映射中是否存在元素(而不是键)。 例如,我有一个映射,想知道一个单词是否是映射中任何一对中的第二个元素,如果是,那么它的键是什么。映射是按键组织的,因此没有迭代每个元素,就无法做到这一点 假设您正在搜索look\u for,则可以使用标准库的std::find\u if: auto it = std::find_if(map.begin(), map.end(), [&loo

是否有任何函数可以查找映射中是否存在元素(而不是键)。
例如,我有一个映射,想知道一个单词是否是映射中任何一对中的第二个元素,如果是,那么它的键是什么。

映射是按键组织的,因此没有迭代每个元素,就无法做到这一点

假设您正在搜索
look\u for
,则可以使用标准库的
std::find\u if

auto it = std::find_if(map.begin(),
                       map.end(),
                       [&look_for](const auto& kv_pair) {
                            return kv_pair.second == look_for;
                       });
if (it != map.end()) {
    auto key = it->first;
    // ...
} else {
    // Value not found
    // ...
}
也可以使用手动循环(
std::find_,如果
通常被认为是更好的,但在这里这可能是过分的)


std::find_if
与lambda一起使用:

map<int,int> m;
m[1] = 10;
m[2] = 20;
m[3] = 30;
auto target = 20;
auto f20 = std::find_if(std::begin(m), std::end(m), [&](const auto& p) {
    return p.second == target;
});
if (f20 != std::end(m)) {
    // We have our value
}
map-m;
m[1]=10;
m[2]=20;
m[3]=30;
自动目标=20;
自动f20=std::find_if(std::begin(m),std::end(m),[&](const auto&p){
返回p.second==目标;
});
如果(f20!=标准::结束(m)){
//我们有自己的价值
}


请注意,与对数键搜索不同,对值的搜索是线性的。

扫描原始键值字典需要
O(n)
时间,而且可能会很慢

为了快速找到特定的值及其键,创建反向字典是一种方法。 对于键值的原始
std::map
,值键的反向字典是
std::unordered_multimap

查找时间为
O(1)

,但请记住,您必须考虑值可能在映射中多次出现的情况。看起来您为问题选择了错误的数据结构。在解除对
映射的引用之前,查看或可能想添加对
映射.end()的检查。哎呀,添加了一个很好的建议。我想应该提到的是,它要求您能够散列您的值类型。
map<int,int> m;
m[1] = 10;
m[2] = 20;
m[3] = 30;
auto target = 20;
auto f20 = std::find_if(std::begin(m), std::end(m), [&](const auto& p) {
    return p.second == target;
});
if (f20 != std::end(m)) {
    // We have our value
}