C++ 排序的容器版本

Container version of C++ sort

我在阅读 Stroustrup 关于 c++ 的博客 (http://isocpp.org/blog/2014/12/myths-3) 时发现了一段有趣的代码:

void do_my_sort(vector<double>& v)
{
  sort(v,[](double x, double y) { return x>y; });  // sort v in decreasing order
}

int main()
{
  vector<double> vd;
  // ... fill vd ...
  do_my_sort(v);
  // ...
} 

请注意 sort 不使用 Stroustrup 解释的传统 sort(v.begin(), v.end(), ...)

I used a container version of sort() to avoid being explicit about the iterators.

但是,我在我的 C++11 编译器上尝试了相同的代码,但它无法编译。我也在使用 ideone 的 C++14 编译器上尝试了同样的方法,但它也无法编译,说没有匹配的排序调用。

这是为什么?

此外,Stroustrup 接下来提到:

I could go further and use a C++14 comparison object:

sort(v,greater<>()); // sort v in decreasing order

我也在 C++11 中对 sort 使用了 great<>() 这样的比较器。他为什么说这是一个 C++14 比较对象?

他自己写的,不标准。因此,您无法在标准库中找到它。你可以这样实现它:

template <class Container, class Comp>
void sort (Container& cont, Comp comp) {
    using std::begin;
    using std::end;
    std::sort(begin(cont), end(cont), comp);
}

正如 Clukester 所指出的,还有 boost::sort 提供此功能。

也许他使用的是 Boost 的排序,而不是人们所期望的标准排序。所以它是 boost::sort,而不是 std::sort

I have used comparators like great<>() for sort in C++11 also. Why is he stating that this is a C++14 comparison object?

C++14 比较仿函数增加了为其 operator() 方法和推导的 return 类型获取转发引用的能力。 Function Objects 集合的模板参数已更改为具有类型 void 的默认参数并使用该类型的特化。

template< class T = void >
struct greater
{
    constexpr bool operator()(const T &lhs, const T &rhs) const;
};

template<>
struct greater<void>
{
    template< class T, class U>
    constexpr auto operator()( T&& lhs, U&& rhs ) const
      -> decltype(std::forward<T>(lhs) > std::forward<U>(rhs));
};