【问题标题】:Use std::sort to find top N items in a std::vector使用 std::sort 查找 std::vector 中的前 N ​​个项目
【发布时间】:2010-12-08 19:20:20
【问题描述】:

我需要对 std::vector 中的元素进行排序,但我只对正在排序的顶部 N 项目感兴趣,而不是整个列表:

例如在 10 个元素的列表中,只需对前 3 个元素进行排序。其他的就不用管了……

1,2,3,6,7,4,9,8,5

这可以使用std::sort 来完成吗?

编辑

我只需要在向量中找到顶部的N 项目。 std::partial_sort_copy 正是我所需要的。

【问题讨论】:

  • 这是一个模糊的问题 - 您是否只想对前三个项目进行排序?还是让整个列表的三个最小元素在开头排序?
  • 如果您的问题得到解答,请接受答案,而不是编辑问题以重复答案。

标签: c++ sorting stl


【解决方案1】:

尝试std::partial_sort 而不是std::sort。 :)

【讨论】:

    【解决方案2】:

    这就是std::partial_sort 的用途。

    【讨论】:

    • 您的链接说初始部分将被排序:“子范围 [first,middle) 包含按升序排序的整个范围的最小元素”
    • 谢谢娄。我脑子里有partial_sortpartition 的困惑。
    【解决方案3】:

    如果您需要订购,那么partial_sort 会这样做,否则如果您只需要对范围进行分区,nth_element 会做得更快。

    【讨论】:

      【解决方案4】:

      只需告诉排序例程您要在哪里停止排序:

      std::vector<int> values;
      for (int i = 0; i < 10; ++i)
          values.push_back(rand() % 10);
      
      std::cout << "UNSORTED" << endl;
      std::copy(values.begin(), values.end(), std::ostream_iterator<int>(std::cout, " "));
      std::cout << std::endl;
      
      std::cout << "SORTED (Partially)" << std::endl;
      std::sort(values.begin(), values.begin() + 3);
      std::copy(values.begin(), values.end(), std::ostream_iterator<int>(std::cout, " "));
      std::cout << std::endl;
      

      【讨论】:

      • 诚然,最初提出的问题非常不清楚,但现在很清楚 entire 向量的前 3 个元素是必需的,因此您的方法行不通。
      猜你喜欢
      • 2013-03-08
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-13
      • 2016-06-15
      • 2018-01-11
      相关资源
      最近更新 更多