バイナリ述語は、コンテナの逆参照されたイテレータの型の2つのパラメータを必要とする呼び出し可能なオブジェクト(関数またはラムダを含む)以外のものではありません。その「役割」はソートアルゴリズムの比較基準を提供することです。
std::sort
アルゴリズムは、この関数または関数オブジェクトがBOOLに変換可能であり、最初の引数がソート順の第2引数の前にある場合にのみ(いわゆる場合、真得た値を返すことを期待弱い厳密注文)。 std::sort
アルゴリズムは、要素を個別に比較するときに述語を要素に適用することによって、オブジェクトの与えられた範囲(コンテナの終わりを始める)を操作(ソート)します。
あなたのケースでは、コンテナが文字列のベクトルの場合、逆参照されたイテレータはstd:string
となり、ラムダは正常に動作します。
コンクリートタイプに依存しないラムダでどのように動作するかを示すコード例ですが、コンテナ内のオブジェクトに少なくともsize()
オペレーションを定義する必要があります。また、(この場合、私は述語を反転させてソート順を元に戻す)バイナリ述語は関数オブジェクトとして提供することができるか、を示しています。
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using Words = std::vector<std::string>;
struct CompareReverse
{
bool operator() (auto lhs, auto rhs)
{
return rhs.size() < lhs.size(); // less-than reversed!
}
};
int main()
{
Words words { "red", "green", "blue", "wizard", "a", "letter", "very-long-word" };
std::sort(words.begin(), words.end(), [](auto a, auto b) { return a.size() < b.size(); });
for (auto w : words)
std::cout << w << std::endl;
std::sort(words.begin(), words.end(), CompareReverse());
for (auto w : words)
std::cout << w << std::endl;
return 0;
}
述語はそれだけで2つの要素を比較しています、何もソートされていません。 'std :: sort'は必要に応じて述語を呼び出し、要素のさまざまなペアを比較し、それらの順序を決定します。 –