std::string を大文字小文字を区別しないで比較する - C++ プログラミング

PROGRAM


std::string を大文字小文字を区別しないで比較する

C++ に用意されている std::string 型の文字列を、大文字小文字の違いを無視して比較したい場合は STL の <algorithm> ヘッダーに定義されている std::equal 関数を使って比較します。

この関数の使い方は少し難しいのですが、比較したい要素(文字)の範囲(先頭と末尾)と、比較で使用する関数を指定します。std::equal の詳細は 二つの配列の各要素が一致しているかを判定する に記しておきます。

 

文字列を比較する場合、比較する文字の範囲は std::string では先頭と末尾を示す イテレータ を cbegin と cend を使って取得します。

二つの文字列を比較するので、std::equal 関数には比較対象の左辺側の先頭と末尾と、右辺側の先頭を渡す必要があります。右辺側の末尾は std::equal 関数が左辺側で指定された範囲から末尾が判断されるので不要です。

 

比較で使用する関数は、今回は次のものを用意してみました。

bool equalCharCaseInsensitiveFunction(const char& lhs, const char& rhs)

{

std::locale locale;

 

return std::tolower(lhs, locale) == std::tolower(rhs, locale);

}

引数に渡された両文字列の文字をそれぞれ小文字にして比較しています。

 

これらを使って、たとえば std::string 型の str1 と str2 を大文字小文字を区別しないで比較すると、次のようになります。

bool equal = str1.size() == str2.size() && std::equal(str1.cbegin(), str1.cend(), str2.cbegin(), equalCharCaseInsensitiveFunction);

これで str1 と str2 とを大文字小文字を無視して比較することができました。

std::equal 関数はあくまでも同じ範囲での比較になるため、それに先立って両方の文字列の長さが一致しているかを調べています。これを忘れると正しい比較ができなくなる場合があるので注意が必要です。


[ もどる ]