在 C++ 中从 unordered_map 访问值

Posted

技术标签:

【中文标题】在 C++ 中从 unordered_map 访问值【英文标题】:accessing values from unordered_map in c++ 【发布时间】:2020-06-13 00:52:28 【问题描述】:

我有一个 unordered_map:

unordered_map<string, list<string>> adj_list;

如何查看字符串列表list<string> 是否包含值?

我试过了:

if(adj_list.find("find")) printf("value found");

但它给了我一个转换错误。 如何访问unordered_map 中的第一个字符串和第二个字符串列表? 澄清:我有一个值"here",它是adj_list 中的第一个字符串,我想在属于"here" 的字符串列表中找到"find"

【问题讨论】:

术语“第二个位置”对于 unorded_map 没有意义 如果您提供一些输入输出示例,我会提供帮助。 对不起,我的意思是 unordered_map 中 ',' 之后的字符串列表> 将您的说明编辑到问题中,而不是作为 cmets。 您成功找到与"here" 关联的std::list<string>?提供最少的代码可以避免我们猜测您的问题。 【参考方案1】:

如果您知道密钥,您可以这样做:

auto l = adj_list.find("here"); // here we get the correct list
if(l != adj_list.end())

    if(std::find(l->second.begin(), l->second.end(),"find") != l->second.end())
    
        printf("Found");
    

如果您不知道地图中正确list<string> 的关键是什么,您可以这样做:

for(auto it=adj_list.begin(); it != adj_list.end(); ++it)

    if(std::find(it->second.begin(), it->second.end(),"find") != it->second.end())
    
        printf("Found");
    

完整代码:

#include<iostream>
#include<unordered_map>
#include<list>
#include<string>

int main()

    std::unordered_map<std::string, std::list<std::string>> adj_list;
    std::list<std::string> l;
    l.emplace_back("find");

    adj_list.emplace("string", l);
    for (auto it = adj_list.begin(); it != adj_list.end(); ++it)
    
        if (std::find(it->second.begin(), it->second.end(), "find") != it->second.end())
        
            printf("Found");
        
    
    return 0;


【讨论】:

OP 有一个字符串列表的映射。想知道地图中的第二个条目(列表)中是否有“find”。 @bhristov,它告诉我这个数据结构没有名为 find 的成员。因为它不识别 .find() 方法 @DenisShevchenko 我更新了我的答案。您需要使用 std::find() 我试过了,但是现在它告诉我```没有匹配函数调用 'find(std::__cxx11::list<:__cxx11::basic_string>> >::iterator , std::__cxx11::list<:__cxx11::basic_string> >::iterator, const string&)' if(std::find(it->second.begin(), it->second.end (), n) != it->second.end())``` @DenisShevchenko 代码在我的系统上运行。我不确定是什么原因造成的。我添加了完整的代码。【参考方案2】:

要在std::list 中查找元素,您可以使用std::find

std::unordered_map<string, list<string>> adj_list /* = ..*/;

auto it_umap = adl_list.find("here");
if (it_umap != adl_list.end())

    auto& words = it_umap->second;
    auto it = std::find(words.begin(), words.end(), "find");
    if (it != words.end())  std::cout << "value found"; 

【讨论】:

OP 有一个字符串列表的映射。想知道地图中的第二个条目(列表)中是否有“find”。 @pm100:更新答案。【参考方案3】:

如果您想搜索具有“here”键的列表,则执行(假设您知道“here”条目确实存在)

auto &here = adl_list["here"];
if (std::find(here.begin(), here.end(),"find") != here.end())

    std::cout << "found";

如果它可能不在那里,那么做

auto &lookup= adl_list.find("here");
if(lookup != adl_list.end())

   auto &here = lookup.second;
   if (std::find(here.begin(), here.end(),"find") != here.end())
   
     std::cout << "found";
   

【讨论】:

以上是关于在 C++ 中从 unordered_map 访问值的主要内容,如果未能解决你的问题,请参考以下文章

无法从分离的线程访问 C++ unordered_map 中的键值对

使用 unordered_map 向量的 C++ 图形,在访问时添加随机数据,如 graph[i][j]

C++ stl unordered_map 单写(只插入,不删除)和单读并发访问

如何在 C++ 中单独锁定 unordered_map 元素

在 C++ 中从外部访问嵌套类

C ++:访问unordered_map中的数据时出现段错误以设置