部分一致の実現 - contains
C++の文字列クラスstd::string
には、特定の文字列が含まれているかどうかを判定するためのメンバ関数contains
が定義されていません。代わりにfind関数の戻り値を判定することで、containsメソッドやincludesメソッドの代用を実現します。
std::string s = "abc";
if (s.find("b") != std::string::npos) {
puts("文字列`b`が見つかりました");
}
stringクラスのメンバ関数find
は検索文字列の出現位置を返す関数ですが、検索文字列が見つからなかった場合にはメンバ定数npos
を返します。そのためこのnposの有無を調べることで、部分一致の判定を実現することが可能となります。
char型の文字を検索する方法
find関数は文字型の値の探索にも対応しているため、次のようなchar型の文字の存在確認も可能です。
if (std::string("ABC").find('B') != std::string::npos) {
puts("文字`B`が見つかりました");
}
contain関数の自作方法
以下ような定義で汎用的なcontain関数を作ることができます。文字列だけでなく、char型の文字やC言語スタイルの文字列型(cons char *
)の検索も可能です。
template<class T> bool contain(const std::string& s, const T& v) {
return s.find(v) != std::string::npos;
}
assert( contain("abc", "b") );
assert(!contain("abc", 'B') );
assert( contain(std::string("abc"), std::string("b")) );
以下の定義はより汎用的なものです。std::string
型以外にもbasic_string
を基本とする様々な文字列クラスに対応しています。
template<class T, class U>
bool contain(const std::basic_string<T>& s, const U& v) {
return s.find(v) != std::basic_string<T>::npos;
}
assert( contain(std::string("abc"), "ab") );
assert( contain(std::string("abc"), 'c') );
assert( contain(std::wstring(L"ab"), L"a") );
assert( contain(std::u16string(u"ab"), u"b") );