C++ 中的一些容器是故意有序的,例如
std::list
、std::vector
或std::map
(甚至是std::deque
,尽管人们可能会质疑它是否有一个订单或两个同等有效的订单)。其他容器 - 不是,例如 std::unordered_map
。当然,这适用于我们可以在标准库之外定义的容器。
不过,这样的容器是可迭代的:您可以从
std::begin(my_container)
到 std::end(my_container)
- 这在某种程度上是容器元素的顺序。
是否存在类型特征或其他机制,我可以在采用容器类型的函数模板中使用它们来确定容器中项目的顺序是否有意义、有意的、固有的 - 或者是否只是任意的、偶然的、短暂的实施细节?
备注:
我不确定您是否正在寻找预定义的特征,但如果不是,这里有一个想法:
#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);
}