如何使用地图::在地图上查找
how to use map::find on map of maps
我在大型代码库中进行一些单元测试时遇到问题。基本上我需要在地图中找到一个值。我写了一个代码片段来解释我的问题是什么。下面演示了数据的构建方式:
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")
,即搜索键,但出于某种原因,你认为你应该搜索值......
相关文章:
- 在地图和列表之间查找标准容器
- 了解标准::地图::查找
- std::在地图上查找无法正常工作并循环访问地图的键和值
- 如何使用地图::在地图上查找
- 如何在给定任意数量的整数的情况下创建一个唯一键?并使用该键存储,然后从地图中查找
- 在地图键的矢量中查找多个字符串
- 如何在具有非常量指针键的地图中通过常量指针键查找
- 在STL地图中通过参考查找并返回
- 查找地图C 没有在地图中找到已经添加的密钥
- 按值在地图中查找 - 方法在速度方面的偏好
- 带地图的 GUI C++最短路径查找器
- 在给定键 (C++) 的地图向量内查找项目
- 在地图列表中查找
- STL 地图查找无法正常工作
- 使用在地图上查找<对,int>
- 如何在将多维 int 数组映射到 C++ 中的字符串时实现在地图上查找或计数
- 地图的查找功能得到错误的结果
- 使用string_view进行地图查找
- 在地图矢量内查找对
- C++11:如何获取C++14模板化地图::查找