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));
};
我在阅读 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));
};