在每种情况下都有`std :: set`排序元素吗?

时间:2012-08-04 13:50:07

标签: c++ sorting stl set std

cplusplus.com引用似乎std::set对元素进行排序。

我需要排序字符串,但我不确定它是否适用于每个平台和编译器。主要是GCC,MinGW,VC。

4 个答案:

答案 0 :(得分:20)

根据其定义,std::set是一个已排序的容器。它的标准部分。对它进行排序有助于维护它的集合,而不仅仅是任意集合。

来源:http://www.sgi.com/tech/stl/set.html

答案 1 :(得分:12)

Actualy std :: set和std :: map并没有真正排序。这两个容器都实现为red-black trees。因此,当您迭代这种类型的容器时,迭代器以这样的方式遍历树,使得它看起来像容器被排序。首先,它访问最左边的节点,然后访问最左边的节点的父节点,依此类推......

答案 2 :(得分:6)

是的,std::set以这样的方式存储其元素:迭代元素将按排序顺序完成(对std::adjacent_find的调用将显示std::set存储唯一项同样)。

#include <algorithm>
#include <iterator>
#include <ios>
#include <iostream>
#include <set>
#include <string>

int main()
{
    auto const ss = std::set<std::string> { "foo", "bar", "test" };
    std::cout << std::boolalpha << std::is_sorted(begin(ss), end(ss)) << "\n";
    std::cout << std::boolalpha << (std::adjacent_find(begin(ss), end(ss)) == end(ss)) << "\n";
    std::copy(begin(ss), end(ss), std::ostream_iterator<std::string>(std::cout, "\n"));
}

Live Example

答案 3 :(得分:2)

<强> C++11 N3337 standard draft 23.2.4&#34;关联容器&#34;:

  

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

  

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

所以是的,订单是有保证的,因为https://stackoverflow.com/a/11812871/895245提到的基本上需要平衡的搜索树实现。

与C ++ 11 unordered_set形成对比,后者可以提供更好的性能,因为它的限制较少:Why on earth would anyone use set instead of unordered_set?使用哈希集。