std :: sort of libcxx(llvmバージョンのC++標準 ライブラリ)は、同じ要素、つまり の比較述語を呼び出します。比較ファンクタの引数は両方とも同じです並べ替える順番は です。ポイントを説明するための縮小例。ソートアルゴリズムは、同じ要素を比較関数に渡す必要があります
$ cat a.cc
#include <algorithm>
#include <vector>
#include <cassert>
int main(int argc, char** argv) {
int size = 100;
std::vector<int> v(size);
// Elements in v are unique.
for (int i = 0; i < size; ++i)
v[i] = i;
std::sort(v.begin(), v.end(),
[&](int x, int y) { assert(x != y); return x < y; });
return 0;
}
$ clang++ -std=c++11 -stdlib=libc++ a.cc -o a.out
$ ./a.out
a.out: a.cc:14: auto main(int, char **)::(anonymous class)::operator()(int, int) const: Assertion `x != y' failed.
./go.sh: line 5: 19447 Aborted (core dumped) ./a.out
libstdC++で正常に動作します。
$ clang++ -std=c++11 -stdlib=libstdc++ a.cc -o a.out
$ ./a.out
同じ要素と比較関数を呼び出すために、この大丈夫です。これは冗長ではありません。同じ指標だけでなく、比較する要素をチェック常によりも
「これは大丈夫ですか」とはどういう意味ですか?それが標準によって許可されているかどうか尋ねていますか? –
私は標準がそのような要件を持っているとは思わない、私は主にアルゴリズムの観点から誰も同じ要素で比較関数を呼び出すことに興味があった。それはどんな場合でもソートを速くするか、バグにすぎませんか? –
FYI、https://llvm.org/bugs/show_bug.cgi?id=20837 –