如何搜索字符串是否是存储在集合中的字符串的前缀
How to search whether a string is a prefix of strings stored in a set?
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
相关文章:
- 显示字符串的集合和子集
- 如何在集合中的特定字符串中查找子字符串
- 在 c++ 中将集合转换为向量和向量转换为字符串时出现运行时异常
- 将字符串集合中的元素添加到字符串集合的向量中
- 将字符串保存在集合中时,C_STR()仍然有效
- 如何使用for_each,transform,Iterator和lambda的某种组合将STD ::集合的字符串转换为小
- 集合中元素的子字符串
- variadic宏可从未知参数集合中生成字符串向量
- 使用shared_ptr<字符串>转换为一个无序集合<字符串>
- 限制集合中的字符串长度
- 在c++中的graphics.h上打印包含字符串的集合
- remove_if字符串匹配集合中的给定字符串
- 创建字符串 c++ 的常量集集合
- 为什么这段代码找不到我集合中最长字符串的长度?
- 访问集合c++中字符串的第一个字母
- 具有前缀和后缀查询的字符串集合的数据结构
- 如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
- 生成与集合中的字符串不匹配的字符串
- 具有字符串成员的结构的集合与向量
- 如何在c++中存储一个字符串集合作为键,json作为值