fre*_*low 296 c++ sorting iterator stl vector
我应该用吗?
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
Run Code Online (Sandbox Code Playgroud)
要么
std::sort(numbers.rbegin(), numbers.rend()); // note: reverse iterators
Run Code Online (Sandbox Code Playgroud)
按降序对矢量进行排序?一种方法或另一种方法有任何好处或缺点吗?
Meh*_*dad 110
实际上,第一个是个坏主意.使用第二个,或者:
struct greater
{
template<class T>
bool operator()(T const &a, T const &b) const { return a > b; }
};
std::sort(numbers.begin(), numbers.end(), greater());
Run Code Online (Sandbox Code Playgroud)
这样,当有人决定numbers
应该持有long
或long long
代替时,你的代码不会默默地破坏int
.
Pub*_*bby 68
使用第一个:
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
Run Code Online (Sandbox Code Playgroud)
这是明确的是怎么回事的-误读的机会较少rbegin
的begin
,甚至有评论.它清晰可读,正是您想要的.
此外,第二个可能效率低于第一个给定反向迭代器的性质,尽管你必须对其进行分析以确定.
小智 61
使用c ++ 14,您可以这样做:
std::sort(numbers.begin(), numbers.end(), std::greater<>());
Run Code Online (Sandbox Code Playgroud)
sho*_*hin 26
那这个呢?
std::sort(numbers.begin(), numbers.end());
std::reverse(numbers.begin(), numbers.end());
Run Code Online (Sandbox Code Playgroud)
Jul*_*rcq 21
您可以使用Lambda函数代替Mehrdad提出的仿函数.
sort(numbers.begin(), numbers.end(), [](const int a, const int b) {return a > b; });
Run Code Online (Sandbox Code Playgroud)
zw3*_*324 16
根据我的机器,long long
使用第一种方法对[1..3000000] 的矢量进行排序大约需要4秒,而使用第二种方法需要大约两倍的时间.显然,这说了些什么,但我也不明白为什么.试想这会有所帮助.
同样的事情在这报道.
正如Xeo所说,-O3
他们几乎用同一时间完成.
ras*_*dcs 11
第一种方法是:
std::sort(numbers.begin(), numbers.end(), std::greater<>());
Run Code Online (Sandbox Code Playgroud)
您可以使用第一种方法,因为它比第二种方法获得更高的效率.
第一种方法的时间复杂度小于第二种方法.
小智 7
bool comp(int i, int j) { return i > j; }
sort(numbers.begin(), numbers.end(), comp);
Run Code Online (Sandbox Code Playgroud)
使用任何。它们几乎相同。
像往常一样,有利有弊。
使用std::reverse_iterator
:
operator>()
std::greater<int>()
std::greater
在以下情况下使用:
至于性能,这两种方法同样有效。我尝试了以下基准测试:
#include <algorithm>
#include <chrono>
#include <iostream>
#include <fstream>
#include <vector>
using namespace std::chrono;
/* 64 Megabytes. */
#define VECTOR_SIZE (((1 << 20) * 64) / sizeof(int))
/* Number of elements to sort. */
#define SORT_SIZE 100000
int main(int argc, char **argv) {
std::vector<int> vec;
vec.resize(VECTOR_SIZE);
/* We generate more data here, so the first SORT_SIZE elements are evicted
from the cache. */
std::ifstream urandom("/dev/urandom", std::ios::in | std::ifstream::binary);
urandom.read((char*)vec.data(), vec.size() * sizeof(int));
urandom.close();
auto start = steady_clock::now();
#if USE_REVERSE_ITER
auto it_rbegin = vec.rend() - SORT_SIZE;
std::sort(it_rbegin, vec.rend());
#else
auto it_end = vec.begin() + SORT_SIZE;
std::sort(vec.begin(), it_end, std::greater<int>());
#endif
auto stop = steady_clock::now();
std::cout << "Sorting time: "
<< duration_cast<microseconds>(stop - start).count()
<< "us" << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用此命令行:
g++ -g -DUSE_REVERSE_ITER=0 -std=c++11 -O3 main.cpp \
&& valgrind --cachegrind-out-file=cachegrind.out --tool=cachegrind ./a.out \
&& cg_annotate cachegrind.out
g++ -g -DUSE_REVERSE_ITER=1 -std=c++11 -O3 main.cpp \
&& valgrind --cachegrind-out-file=cachegrind.out --tool=cachegrind ./a.out \
&& cg_annotate cachegrind.out
Run Code Online (Sandbox Code Playgroud)
std::greater
demo
std::reverse_iterator
demo
时间是一样的。Valgrind 报告相同数量的缓存未命中。