std::set<std::string> setStrings;
setString.insert("abc");
setString.insert("abcd");
setString.insert("babc");
问题&GT;我想知道如何检查“bab”是否是存储字符串的前缀之一?
答案 0 :(得分:7)
尝试使用Trie。
答案 1 :(得分:5)
我假设您不想搜索整个集合:只需使用std::set<std::string>::lower_bound()
并迭代,直到找到没有所需前缀的std::string
:
std::string const prefix("bab");
for (std::set<std::string>::const_iterator it(setStrings.lower_bound(prefix));
it != setStrings.end() && it->find(prefix) == 0; ++it) {
std::cout << "prefixed: '" << *it << "'\n";
}
如果您只想查找是否有一个带有相应前缀的字符串,您可以使用循环中的条件。
答案 2 :(得分:1)
有更多方法可以做到这一点。这是其中之一:
std::set<std::string> setStrings;
setStrings.insert("abc");
setStrings.insert("abcd");
setStrings.insert("babc");
std::string prefix("bab");
std::set<std::string>::iterator i;
for (i = setStrings.begin(); i != setStrings.end(); ++i)
{
if ((*i).compare(0, prefix.length(), prefix) == 0)
std::cout << *i << " starts with: " << prefix << std::endl;
}
这是另一种方式:
std::set<std::string>::iterator i;
for (i = setStrings.begin(); i != setStrings.end(); ++i)
{
if ((*i).substr(0, prefix.length()) == prefix)
std::cout << *i << " starts with: " << prefix << std::endl;
}
答案 3 :(得分:0)
std::set<std::string> setString;
setString.insert("abc");
setString.insert("abcd");
setString.insert("babc");
for ( auto &i : setString ){
std::cout << i << " result: "<< ( i.find("bab")==0) <<std::endl;
}
这是C ++ 11,但str::find
在旧版C ++中的工作方式相同
abc result: 0
abcd result: 0
babc result: 1