TL; DR
아무거나 사용하십시오. 그들은 거의 같습니다.
지루한 답변
평소와 같이 장단점이 있습니다.
사용 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;
}
이 명령 행으로 :
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
std::greater
demo
std::reverse_iterator
demo
타이밍은 동일합니다. Valgrind는 같은 수의 캐시 누락을보고합니다.