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);

  • 相关阅读:
    python学习之列表
    python学习之数据类型
    开启python学习之路
    软件工程中的需求分析包括的主要内容
    论需求分析和数据库设计的重要性
    Android的ListView分页功能(上滑加载更多)
    设置ListView显示到最后一行
    一对一Socket简单聊天的实现
    Spring Cloud学习笔记-004
    Spring Cloud学习笔记-003
  • 原文地址:https://www.cnblogs.com/niukuo/p/8325716.html
Copyright © 2011-2022 走看看