在子字符串数组中高效地查找字符串
C++: find a string in an array of sub-string efficiently
我有一个字符串前缀数组:std::vector<std::string> haystack = {"/bin/", "/usr/bin/", "/usr/local/bin/"}
.
是否有一种有效的方法来发现std::string needle = "/bin/echo"
从haystack
的子字符串开始,使用标准c++库?
如果我需要找到确切的匹配,我可以使用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;
我要添加的一个"优化"是,如果您使用std::any_of
,它将在找到第一个子字符串匹配时短路
auto found = std::any_of(begin(haystack),
end(haystack),
[&needle](std::string const& sub)
{
return needle.compare(0, sub.size(), sub) == 0;
});
如果你想找到匹配的子字符串,你可以使用std::find_if
,它也会在找到第一个匹配时短路。
auto match = std::find_if(begin(haystack),
end(haystack),
[&needle](std::string const& sub)
{
return needle.compare(0, sub.size(), sub) == 0;
});
- 按字符串长度降序排序
hasystack
。 - 按此顺序比较不超过
needle
的前缀;从右到左。例如,如果prefix
是5个字符长,比较prefix[4]
和needle[4]
,然后比较prefix[3]
和needle[3]
,以此类推。
这样,您将立即丢弃许多不匹配项。作为奖励,您将首先找到最长的匹配(可能正是您想要的)。
相关文章:
- 使用正则表达式regex_search在字符串中查找字符串
- 按类型与字符串查找对象
- 使用C RTTI(内置)通过字符串查找功能指针
- 关于获取行和字符串查找函数的问题
- 字符串查找方法找不到第一字母
- C++ 字符串.查找()
- 遇到字符串::查找的问题
- 将一个数组作为子字符串查找到另一个数组中
- 字符串查找第一个非的 C++ 问题
- 如何将通配符与字符串::查找一起使用
- 字符串::查找问题 (C++)
- 性能标准::strstr vs. 标准::字符串::查找
- C++字符串::查找崩溃应用程序
- 使用字符串查找单词的正确方法是什么
- 如何在<string>没有 std::string 中介的情况下制作一个支持通过 C 字符串查找的集合?
- 使用C++根据行中的第一个字符串查找行(仅一个)
- Borland字符串::查找bug
- std::map如何通过字符串查找元素
- 字符串查找函数返回奇数
- 如何使用子字符串查找数字行的正确部分