You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通用嵌套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...);
}

工作说明

  1. 基础重载:当仅传入一个键时,直接调用map.contains()完成单层检查。
  2. 递归重载:当传入多个键时,先查找第一个键:
    • 找不到则直接返回false
    • 找到则取出对应的值(需为下一层map类型),递归调用contains检查剩余键
  3. 模板会自动推导所有键和嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 23:22:09