사용해야합니까
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
또는
std::sort(numbers.rbegin(), numbers.rend()); // note: reverse iterators
내림차순으로 벡터를 정렬하려면? 하나의 접근 방식이나 다른 접근 방식의 이점이나 단점이 있습니까?
답변
사실, 첫 번째는 나쁜 생각입니다. 두 번째 또는이 중 하나를 사용하십시오 .
struct greater
{
template<class T>
bool operator()(T const &a, T const &b) const { return a > b; }
};
std::sort(numbers.begin(), numbers.end(), greater());
그렇게하면 누군가가 또는 대신 대신 numbers
해야한다고 결정할 때 코드가 자동으로 중단되지 않습니다 .long
long long
int
답변
첫 번째를 사용하십시오.
std::sort(numbers.begin(), numbers.end(), std::greater<int>());
오독의 적은 기회 – 그것은에 무슨 일이 일어나고 있는지의 명시 적이다 rbegin
등 begin
도 코멘트와 함께. 명확하고 읽을 수 있으며 정확히 원하는 것입니다.
또한 두 번째는 리버스 반복자의 특성으로 인해 첫 번째보다 효율이 떨어질 수 있지만 확실하게 프로파일 링해야합니다.
답변
c ++ 14를 사용하면 다음을 수행 할 수 있습니다.
std::sort(numbers.begin(), numbers.end(), std::greater<>());
답변
이건 어때?
std::sort(numbers.begin(), numbers.end());
std::reverse(numbers.begin(), numbers.end());
답변
Mehrdad가 제안한 functor 대신 Lambda 함수를 사용할 수 있습니다.
sort(numbers.begin(), numbers.end(), [](const int a, const int b) {return a > b; });
답변
내 컴퓨터에 따르면 long long
첫 번째 방법을 사용하여 [1..3000000] 의 벡터를 정렬하는 데는 약 4 초가 걸리고 두 번째 방법을 사용하면 약 두 배가 걸립니다. 그것은 분명히 무언가를 말하지만, 나는 왜 그런지 이해하지 못합니다. 이것이 도움이 될 것이라고 생각하십시오.
Xeo가 말했듯이, -O3
그들은 거의 같은 시간을 사용하여 마무리합니다.
답변
첫 번째 접근 방식은 다음과 같습니다.
std::sort(numbers.begin(), numbers.end(), std::greater<>());
두 번째보다 효율성이 높아 첫 번째 방법을 사용할 수 있습니다.
첫 번째 방법의 시간 복잡도는 두 번째 방법보다 적습니다.