【C++】std::stringで文字列が含まれるかどうかの判定【contains】

部分一致の実現 – 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") );

広告