【发布时间】:2017-01-14 06:08:53
【问题描述】:
我有一个字符串前缀数组:std::vector<std::string> haystack = {"/bin/", "/usr/bin/", "/usr/local/bin/"}。
有没有一种有效的方法可以使用标准 C++ 库找到 std::string needle = "/bin/echo" 以来自 haystack 的子字符串开头?
如果我需要找到完全匹配,我可以使用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::find_if()。 -
比遍历整个
haystack数组(即O(n))更快。find_if将以O(n)的速度执行完全相同的循环。 -
分而治之。但即使这样也不能保证比 O(n) 更快。
-
对搜索字符串和搜索文本更精确。你想测试每个字符串的任何前缀。是否所有前缀都是以 / 结尾的目录。您想在前缀目录下的任何级别查找文件还是只查找直接子目录。这种细节将有助于找到最有效的方法。它还取决于数据大小...
-
前缀是否排序? “前缀”是什么意思:完全匹配还是部分匹配? “/bin/foo/echo”会匹配“/bin/”吗?前缀可以包含“/usr/lib”之类的内容并匹配“/usr/lib64/baz”吗?