私は文字列接頭辞の配列を持っています:std::vector<std::string> haystack = {"/bin/", "/usr/bin/", "/usr/local/bin/"}
。C++:サブストリングの配列内の文字列を効率的に見つける
std::string needle = "/bin/echo"
は、標準C++ライブラリを使用してhaystack
のサブストリングで始まることがわかりますか。
正確な一致を見つける必要がある場合は、効率的なバイナリ検索を実行するstd::set<std::string>
を使用できますが、文字列の最初の部分だけを一致させる必要があるため、現在は単純な方法ループ:文字列の長さの降順によって
for (auto it = haystack.begin(); it != haystack.end(); it++) {
if (needle.compare(0, it->size(), *it) == 0) {
return true; // Found it
}
}
return false;
_efficient_を定義してください。コードを短縮するには 'std :: find_if()'があります。 –
'haystack'配列全体を反復するよりも速く、' O(n) 'になります。 'find_if'は' O(n) 'の速度でまったく同じループを実行します。 – pelya
分裂して征服する。しかし、それでもO(n)より速くなることは保証できません。 –