【问题标题】:Does `std::set` sort elements in every case? [duplicate]`std::set` 在每种情况下都会对元素进行排序吗? [复制]
【发布时间】:2012-08-02 07:05:39
【问题描述】:

cplusplus.com 参考看来std::set 对元素进行排序。

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

【问题讨论】:

    标签: c++ sorting stl set std


    【解决方案1】:

    是的,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

    【讨论】:

    • 我真的不关心问题或答案,但我刚刚学习了一个新的很棒的 c++11 语法,所以这是一个很好的答案!
    • @Mazyod 很高兴你喜欢它!我将答案更新为我现在编写它的方式(使用其他一些 C++11 功能):自动 + 初始化器列表、非成员 begin()/end()copy 改为 ostream_iterator for_each 和一个 lambda。
    【解决方案2】:

    C++11 N3337 standard draft 23.2.4 “关联容器”:

    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? 例如使用哈希集。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 为什么不按照std::unordered_map 实现std::set,它已经摊销了O(1) 插入/查找?
      • @AndreyMishchenko,为此您可以使用std::unordered_set :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多