首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >容器特性- is_multi、is_ordered、is_associative

容器特性- is_multi、is_ordered、is_associative
EN

Stack Overflow用户
提问于 2015-07-20 21:57:17
回答 1查看 277关注 0票数 0

容器是“多”还是“无序”,有什么特征吗?

例如:

代码语言:javascript
复制
is_multi<std::multiset<Foo>>::value_type //true
is_multi<std::set<Foo>>::value_type //false
is_ordered<std::map<Foo, Bar>>::value_type //true
...

编写它们非常容易(因为stl中的容器很少),但我的问题是,是否有这样的调用(或容器中的某个类型定义)是stl

为什么?

我正在写一些通用的算法,它们在“多”容器上的工作方式不同(例如,当找到值时的早期)或“有序”容器上的工作方式不同。

EN

回答 1

Stack Overflow用户

发布于 2015-07-21 15:00:59

我希望有一些区分“多”和“无序”容器的标志。例如,像所有的关联容器一样,它包含key_type成员类型定义。它允许编写如下特征:

代码语言:javascript
复制
template<typename T>
struct to_void
{
    typedef void type;
};

template <typename Container, typename dummy = void>
struct is_associative_container : std::false_type {};

template <typename Container>
struct is_associative_container
<Container, typename to_void<typename Container::key_type>::type > : std::true_type{};

我没有找到任何东西,所以我使用了枚举方法。下面是容器的特征:

代码语言:javascript
复制
 #include <map>
 #include <set>
 #include <unordered_map>
 #include <unordered_set>

template<typename T>
struct to_void
{
    typedef void type;
};

template <typename Container, typename dummy = void>
struct is_associative_container : std::false_type {};

template <typename Container>
struct is_associative_container<Container, typename to_void<typename Container::key_type>::type > : std::true_type{};

template <typename Container>
struct is_multi_container : std::false_type {};

template <typename Container>
struct is_unique_container : std::conditional<is_multi_container<Container>::value, std::false_type, std::true_type>::type{};

template <typename Container>
struct is_unordered_container : std::false_type {};

template <typename Container>
struct is_ordered_container : std::conditional<is_unordered_container<Container>::value, std::false_type, std::true_type>::type{};

template <typename T, typename Compare, typename Alloc>
struct is_multi_container<std::multiset<T,Compare, Alloc>> : std::true_type {};

template <typename T, typename Compare, typename Alloc>
struct is_multi_container<std::multimap<T, Compare, Alloc>> : std::true_type{};

template <typename T, typename Hash, typename Pred, typename Alloc>
struct is_multi_container<std::unordered_multimap<T, Hash, Pred, Alloc>> : std::true_type{};

template <typename T, typename Hash, typename Pred, typename Alloc>
struct is_multi_container<std::unordered_multiset<T, Hash, Pred, Alloc>> : std::true_type{};

template <typename T, typename Hash, typename Pred, typename Alloc>
struct is_unordered_container<std::unordered_multimap<T, Hash, Pred, Alloc>> : std::true_type{};

template <typename T, typename Hash, typename Pred, typename Alloc>
struct is_unordered_container<std::unordered_map<T, Hash, Pred, Alloc>> : std::true_type{};

template <typename T, typename Hash, typename Pred, typename Alloc>
struct is_unordered_container<std::unordered_multiset<T, Hash, Pred, Alloc>> : std::true_type{};

template <typename T, typename Hash, typename Pred, typename Alloc>
struct is_unordered_container<std::unordered_set<T, Hash, Pred, Alloc>> : std::true_type{};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31518418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档