[C++] std::sortに渡すソート条件を指定する比較関数 (Compare Function)

自分が作ったクラスをベクターなどに格納しそれらを指定の任意の条件でソートしたい場合があると思います。 std::sortはこのソートの条件に使う比較関数オブジェクトを受け取ってそれに従ってソートしてくれます。

比較関数は二つのオブジェクトを引数にとり最初に引数が2番めの引数より小さい時にtrueを返すようにします。(昇順でソートする場合)

文字列の長さ順位ソートする場合の比較関数

[cpp]
bool comp(const std::string& lh, const std::string& rh) {
// 文字列lhの長さが文字列rhより短かったらtrueを返す
return lh.length() < rh.length();
}
[/cpp]

関数ではなくoperator()を実装したクラスとして宣言し、そのオブジェクトを渡すこともできます。

operator()をもったクラスとして実装する場合

[cpp]

class Comp {
public:
bool operator() (const std::string& lh, const std::string& rh) {</pre>

// 文字列lhの長さが文字列rhより短かったらtrueを返す
return lh.length() < rh.length();
}
};

[/cpp]

文字列のリストを長さ順でソートする例

[cpp]

#include <stdio.h>
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

bool comp(const std::string& lh, const std::string& rh) {

return lh.length() < rh.length();
}

class Comp {
public:
bool operator() (const std::string& lh, const std::string& rh) {

return lh.length() < rh.length();
}
};

int main () {

std::vector<std::string> strs {
"clock",
"factory",
"industrialization",
"skyscraper",
"sun"
};

// 二つの引数をうけとりboolを返す関数を渡す場合
std::sort(strs.begin(), strs.end(), comp);
for(const std::string& str : strs) {

std::cout << str << std::endl;
}

std::cout << std::endl;

// operator() を持ったクラスのオブジェクトを渡す場合
std::sort(strs.begin(), strs.end(), Comp());
for(const std::string& str : strs) {

std::cout << str << std::endl;
}
}

[/cpp]

実行結果

sun
clock
factory
skyscraper
industrialization

sun
clock
factory
skyscraper
industrialization

ラムダ式でソートの条件を指定する場合

[cpp]
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>

int main()
{
std::vector < std::string> words{ "12345", "12", "123456", "123" };

std::sort(words.begin(), words.end(), [](const std::string& lh, const std::string& rh) {
return rh.length() > lh.length(); });

for (const std::string str : words)
{
std::cout << str << std::endl;
}
}
[/cpp]

実行結果

12
123
12345
123456

kaizawa

闘う兼業主夫プログラマー。外資系IT企業所属。C++、Java、Solaris、Oracle、セキュリティ、DLP(Data Loss Prevention)、D&D、空手二段(極真会館)、柔道初段、柔術白帯ストライプ3(トライフォース)。English/中文

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です