如何判断容器类型中的项目顺序是否任意?

问题描述 投票:0回答:1

C++ 中的一些容器是故意有序的,例如

std::list
std::vector
std::map
(甚至是
std::deque
,尽管人们可能会质疑它是否有一个订单或两个同等有效的订单)。其他容器 - 不是,例如
std::unordered_map
。当然,这适用于我们可以在标准库之外定义的容器。

不过,这样的容器是可迭代的:您可以从

std::begin(my_container)
std::end(my_container)
- 这在某种程度上是容器元素的顺序。

是否存在类型特征或其他机制,我可以在采用容器类型的函数模板中使用它们来确定容器中项目的顺序是否有意义、有意的、固有的 - 或者是否只是任意的、偶然的、短暂的实施细节?


备注:

  • 任何 C++ 语言版本都可以,越早越好。
  • 我想这个问题也适用于范围,但我最感兴趣的是实际的容器。
  • 我(大部分)忽略了添加/删除操作下顺序和迭代器的稳定性。
c++ containers std element-ordering
1个回答
0
投票

我不确定您是否正在寻找预定义的特征,但如果不是,这里有一个想法:

#include <vector>
#include <unordered_map>
// etc

template<typename T>
struct is_ordered_container;

template<typename T, typename Alloc>
struct is_ordered_container<std::vector<T, Alloc>> : std::true_type {};

template<typename Key, typename T, typename Hash, typename KeyEqual, typename Alloc>
struct is_ordered_container<std::unordered_map<Key, T, Hash, KeyEqual, Alloc>> : std::false_type {};

// etc

int main()
{
  static_assert(is_ordered_container < std::vector<int> >::value);
  static_assert(!is_ordered_container < std::unordered_map<int,int> >::value);
}
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.