如何搜索字符串是否是存储在集合中的字符串的前缀?

时间:2012-02-01 23:04:49

标签: c++ algorithm stl

std::set<std::string> setStrings;

setString.insert("abc");
setString.insert("abcd");
setString.insert("babc");

问题&GT;我想知道如何检查“bab”是否是存储字符串的前缀之一?

4 个答案:

答案 0 :(得分:7)

尝试使用Trie。

http://en.wikipedia.org/wiki/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