std :: set迭代顺序是否总是根据C ++规范提升?

时间:2012-01-12 10:59:08

标签: c++ stl set

这里http://www.cplusplus.com/reference/stl/set/我读到C ++中的std :: set“通常”实现为树(红黑色?)并且已经排序。

我无法理解,这是否意味着按规范 set的迭代顺序总是在提升?或者它只是“通常的实现细节”,有时,某些库/编译器可能违反这个约定?

5 个答案:

答案 0 :(得分:44)

根据C ++标准,对std::set中元素的迭代按照std::less或可选比较谓词模板参数确定的排序顺序进行。

(同样根据C ++标准,插入,查找和删除时间最多为O(lg n )时间,因此平衡搜索树目前是std::set唯一可行的实现选择,即使标准没有强制要求使用红黑树。)

答案 1 :(得分:20)

这意味着内部std::set将其元素存储为已排序的树。但是,规范没有说明排序顺序。默认情况下,std::set使用std::less,因此将从低到高排序。但是,您可以使用此模板参数使排序功能成为您想要的任何内容:

std::set<valueType, comparissonStruct> myCustomOrderedSet;

例如:

std::set<int, std::greater<int> > myInverseSortedSet;

struct cmpStruct {
  bool operator() (int const & lhs, int const & rhs) const
  {
    return lhs > rhs;
  }
};

std::set<int, cmpStruct > myInverseSortedSet;

事实上,这些示例也会在您链接的网站上提供。更具体地说:set constructor

答案 2 :(得分:3)

默认比较器较小,因此设置将按升序排序。要更改此设置,您可以指定另一个现有或自定义比较器作为模板参数。

答案 3 :(得分:2)

  

按规范迭代顺序的set总是在升序

是的,如果按顺序打印出来,则set的值总是递增的。正如描述所说,它通常使用红黑树(RBT)实现,但编译器编写者可以选择违反此规则,但通常会坚持使用RBT主题,因为任何其他实现都不会实现资源效率set的任务。

答案 4 :(得分:1)

C ++ 11 N3337标准草案

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf

23.2.4“联合容器”说:

  

1关联容器提供基于密钥的快速数据检索。该库提供了四种基本类型   关联容器:set,multiset,map和multimap。

  

10关联容器迭代器的基本属性是它们遍历容器   按键的非降序顺序,其中非降序由用于的比较定义   构建它们。

所以,订单由C ++标准保证。

这就是为什么gcc 6.4.0将其实现为BST而不是hashmap:What is the underlying data structure of a STL set in C++?

将此与C ++ 11 unordered_set进行对比,后者倾向于通过散列图实现提供更好的性能,代价是更加严格(没有免费的排序遍历),如下所示: