通用嵌套map多键存在性检查的单函数实现方案问询
实现任意嵌套深度std::map的键存在检查
你完全可以用可变参数模板实现一个通用函数,覆盖任意嵌套深度的std::map键存在性检查,不用为每一层嵌套编写重复代码。
现有固定深度实现示例
你目前针对两层嵌套map的检查代码:
template< typename Key1T, typename Key2T, typename ValueT > bool contains ( std::map< Key1T, std::map< Key2T, ValueT > > const & m , Key1T const & k1 , Key2T const & k2 ) { return m.contains( k1 ) && m.at( k1 ).contains( k2 ); }
通用可变参数模板实现
通过递归逻辑的可变参数模板,可以支持从1层到任意多层的嵌套map检查:
// 基础情况:检查单个键(单层map) template <typename MapT, typename KeyT> bool contains(const MapT& map, const KeyT& key) { return map.contains(key); } // 递归情况:检查多个键(多层嵌套map) template <typename MapT, typename FirstKeyT, typename... RestKeysT> bool contains(const MapT& map, const FirstKeyT& first_key, const RestKeysT&... rest_keys) { auto it = map.find(first_key); if (it == map.end()) { return false; } // 递归检查剩余键,当前值作为下一层的map return contains(it->second, rest_keys...); }
工作说明
- 基础重载:当仅传入一个键时,直接调用
map.contains()完成单层检查。 - 递归重载:当传入多个键时,先查找第一个键:
- 找不到则直接返回
false - 找到则取出对应的值(需为下一层map类型),递归调用
contains检查剩余键
- 找不到则直接返回
- 模板会自动推导所有键和嵌套map的类型,无需手动指定模板参数。
使用示例
#include <map> #include <string> int main() { // 三层嵌套map std::map<int, std::map<std::string, std::map<double, bool>>> nested_map; nested_map[1]["test"][3.14] = true; // 检查存在的键组合 bool exists = contains(nested_map, 1, "test", 3.14); // 返回true // 检查不存在的键组合 bool not_exists = contains(nested_map, 2, "test", 3.14); // 返回false return 0; }
内容的提问来源于stack exchange,提问作者DrPepperJo
相关产品推荐
相关产品推荐

