【问题标题】:Does STL and vector provide sort option?STL 和向量是否提供排序选项?
【发布时间】:2010-06-21 12:20:35
【问题描述】:

STL 和 Vector 是否提供默认排序选项?

【问题讨论】:

  • 什么是“默认排序选项”?

标签: c++ list sorting stl vector


【解决方案1】:

vector 类没有 sort 函数。

但是有一个sort 可以在所有迭代器范围内工作。 vector 确实公开了迭代器。

对向量进行排序vec

#include <algorithm>

std::sort(vec.begin(), vec.end());

【讨论】:

  • 这就是你想要做的,Boost 绝对不是必需的。
  • 并非所有容器 - 只有那些具有随机访问权限的容器。 list有一个成员函数sort,有序的关联容器已经排序,无序的关联容器无法排序。
  • 为了完整起见,您可以提到它也可以指定如何对其进行排序。
  • @Mike:当然是真的。我编辑了我的答案。我只是不想详细介绍迭代器,因为 OP 可能不熟悉它们。
  • @Mattias:是的,但是 OP 没有说他需要这个。如果他这样做,我会编辑它。
【解决方案2】:

是的,stl 算法中有sort()。你应该看看http://www.cplusplus.com/reference/algorithm/sort/

【讨论】:

  • @Shadow:当然。例如:std::sort(vec.begin(),vec.end(),std::greater&lt;int&gt;());,见&lt;algorithm&gt;&lt;functional&gt;
【解决方案3】:

你可能想要std::sort

#include <algorithm>
#include <vector>

int
main()
{
    std::vector<int> foo;

    std::sort( foo.begin(), foo.end() );

    return 0;
}

下面是使用两个 boost 库的类似示例。

#include <boost/assign/list_of.hpp>

#include <boost/foreach.hpp>

#include <algorithm>
#include <iostream>
#include <vector>

int
main()
{
    std::vector<int> foo = boost::assign::list_of(1)(4)(5)(10)(3)(2);

    std::cout << "unsorted" << std::endl;
    BOOST_FOREACH( const int i, foo ) {
        std::cout << i << std::endl;
    }

    std::sort( foo.begin(), foo.end() );

    std::cout << "sorted" << std::endl;
    BOOST_FOREACH( const int i, foo ) {
        std::cout << i << std::endl;
    }

    return 0;
}

【讨论】:

  • 我认为如果您坚持基础,您的代码示例会更好。要求读者熟悉两个不同的 Boost 库只是为了理解 std::sort 示例可能有点多问。
  • 对于简单的情况,像使用 boost 进行排序很可能是不合理的。
  • 我认为你反应过度了——这里使用的两个 Boost 结构非常容易理解,即使对于 Boost 的初学者(我也是)来说也是如此。没有必要使用它们 - 事实上,只需使用 std::sort( beginIndex, endIndex ) 行就足够了 - 但它们几乎没有“要求读者熟悉两个 Boost 库”。
  • @jhominal:我并没有反应过度,我只是说这个例子不如它本来的那么清楚。我并没有说它像现在这样不可读,只是建议改进。 :)
  • list_of 和 foreach 只是提升的皮毛,您无需熟悉整个库即可了解它们的作用。完全不熟悉 boost 的 C++ 程序员应该能够轻松掌握我的示例中提出的概念。在这样一个微不足道的例子中单方面声明没有必要使用 boost 是一些初学者回避使用它的原因。是的,这可能令人生畏,但此处的示例显示不同。
【解决方案4】:

正如其他人在回答中提到的那样,有 std::sort 功能。

但是,通过“默认排序选项?”。你的意思是你想对一个向量进行排序,其中 T 是你定义的一个类。在这种情况下,你必须在你的类中实现“operator

例如,

class Foo 
{
    public : 
      Foo();
      ~Foo();
    private :
        int c;
};

std::vector<Foo> foovec;
std::sort(foovec.begin(), foovec.end());

为确保上面的“std::sort”行正常工作,您需要在 Foo 中定义“operator

 class Foo 
 {
     public : 
       Foo();
       ~Foo();
       bool operator<(const Foo& rFoo) const;
     private :
       int c;
 };

bool Foo::operator<(const Foo& rFoo) const
{
    return(c < rFoo.c);
}

【讨论】:

    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2011-02-15
    • 2013-03-13
    • 1970-01-01
    相关资源
    最近更新 更多