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

How to search whether a string is a prefix of strings stored in a set?

本文关键字:字符串 集合 何搜索 前缀 存储 是否是 搜索      更新时间:2023-10-16
std::set<std::string> setStrings;
setString.insert("abc");
setString.insert("abcd");
setString.insert("babc");

问题>我想知道如何检查"bab"是否是存储字符串的前缀之一?

尝试使用 Trie。

http://en.wikipedia.org/wiki/Trie

我假设你不想搜索整个集合:只需使用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";
}

如果您只想查找是否存在一个具有相应前缀的字符串,则可以使用循环中的条件。

还有更多方法可以做到这一点。这是其中之一:

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;
}
   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