zoukankan      html  css  js  c++  java
  • c++ 使用模板按类型统计stl多维容器中元素的数量

    struct ItemCounter
    {
    template<typename T1, typename T2, typename = typename std::enable_if<!std::is_same<T1, typename T2::value_type::second_type>::value>::type>
    static typename T2::value_type::second_type::size_type Count(const T2 &container) {
    typename T2::value_type::second_type::size_type ret = 0;
    for (const auto &item : container) {
    ret += ItemCounter::Count<T1>(item.second);
    }
    return ret;
    }
    template<typename T1, typename T2, typename = typename std::enable_if<!std::is_same<T1, typename T2::value_type>::value>::type>
    static typename T2::value_type::size_type Count(const T2 &container) {
    typename T2::value_type::size_type ret = 0;
    for (const auto &item : container) {
    ret += ItemCounter::Count<T1>(item);
    }
    return ret;
    }
    template<typename T1, typename T2, typename = typename std::enable_if<std::is_same<T1, typename T2::value_type>::value>::type>
    static typename T2::size_type Count(const T2 &container)
    {
    return container.size();
    }
    template<typename T1, typename T2, typename = typename T2::value_type::second_type, typename = typename std::enable_if<std::is_same<T1, typename T2::value_type::second_type>::value>::type>
    static typename T2::size_type Count(const T2 &container)
    {
    return container.size();
    }
    };

    template<typename T, typename TContainer>
    size_t ItemCount(const TContainer &container)
    {
    return ItemCounter::Count<T>(container);
    }

    代码重构时会方便很多,支持value_type为T和pair<X,T>类型的容器

    例如原来:

    std::vector<A> arr;

    size_t sz = arr.size();

    重构后:

    std::map<std::string, std::vector<A> > mapped_arr;

    size_t sz = ItemCount<A>(mapped_arr);

  • 相关阅读:
    阿里云“网红"运维工程师白金:做一个平凡的圆梦人
    3235 战争
    1291 火车线路(区间修改,区间最值)
    P3183 [HAOI2016]食物链
    P1189 SEARCH(逃跑的拉尔夫)
    P1794 装备运输_NOI导刊2010提高(04)
    P2347 砝码称重
    P1332 血色先锋队
    P1772 [ZJOI2006]物流运输
    P1038 神经网络
  • 原文地址:https://www.cnblogs.com/niukuo/p/8325716.html
Copyright © 2011-2022 走看看