如何使用地图::在地图上查找

how to use map::find on map of maps

本文关键字:地图 查找 何使用      更新时间:2023-10-16

我在大型代码库中进行一些单元测试时遇到问题。基本上我需要在地图中找到一个值。我写了一个代码片段来解释我的问题是什么。下面演示了数据的构建方式:

map<string, map<string, string>> testmap;
map<string, string> item;
item.insert(pair<string,string>("hello","world"));
testmap.insert(pair<string, map<string,string> > ("key",item));
然后,在

稍后的某个时候,我需要在获取密钥之前检查是否已添加值。从 cpp 首选项中,[] 运算符的返回为

引用新元素的映射值(如果没有 密钥存在。否则引用映射值 键等效于键的现有元素。

如果我理解正确,从评论中可以清楚地看出我不是,这意味着如果没有具有该键的元素,则会插入一个新元素。我想避免这种情况,并返回错误消息。

以下内容是错误的,我试图理解为什么:

if (testmap.find(map<string,string>("hello","world")) != testmap.end()) 
{
    ...
    return testmap["hello"]["world"];
}

要在映射中查找值,不能使用find查找键的成员函数。但是,您可以找到一个值,例如,通过将std::find_if与自定义比较器一起使用:

using value_t = std::map<std::string, std::string>;
using key_t = std::string;
using map_t = std::map<key_t, value_t>;
map_t m { { "key" , { { "hello", "world" } } } };
value_t v { { "hello", "world" } };  // value to be found
auto iter = std::find_if(m.begin(), m.end(),
               [&v](const auto& e){ return e.second == v; });
std::cout << (iter != m.end()) << std::endl;

现场演示:https://wandbox.org/permlink/1b0bjbnnPY8E0uiU


请注意,这将从 C++14 开始工作。在 C++11 中,您需要编写:

auto iter = std::find_if(m.begin(), m.end(),
               [&v](const map_t::value_type& e){ return e.second == v; });

更新

我仍然不清楚你想达到什么目的。如果仅当两个级别的键都存在时才需要引用最里面的值,则可以执行(C++17 语法(:

if (auto i1 = m.find("key"); i1 != m.end())
   if (auto i2 = i1->second.find("hello"); i2 != i1->second.end())
      std::cout << i2->second << std::endl;  // same as m["key"]["hello"] here but faster
在我看来

,你想要的是testmap.find("key"),即搜索键,但出于某种原因,你认为你应该搜索值......