这里http://www.cplusplus.com/reference/stl/set/我读到C ++中的std :: set“通常”实现为树(红黑色?)并且已经排序。
我无法理解,这是否意味着按规范 set的迭代顺序总是在提升?或者它只是“通常的实现细节”,有时,某些库/编译器可能违反这个约定?
答案 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
进行对比,后者倾向于通过散列图实现提供更好的性能,代价是更加严格(没有免费的排序遍历),如下所示: