我有一个目标字符串和一个字符串 vector 。我想检查 vector 中的任何字符串是否包含在我的目标字符串中并做一些事情。否则,做其他的。
这样做的最佳方式是什么。我知道我可以使用 for 循环和 string::find。但是STL中是否有其他函数可以做到这一点呢?还是使用 lambda 函数?
我试过 for 循环,它肯定会工作
std::string target = "United States";
std::vector<std::string> stringVec = {"United","America","Kindom"};
For (auto it = stringVec.cbegin(); it!=stringVec.cend(); ++it)
{
if (target.find(*it)!=std::string::npos)
cout << "Contains";
else
cout << "Not existed";
}
从 C++ 代码的细节中抽象出来,您所描述的问题称为多字符串搜索问题。在该问题中,您将获得一个模式字符串列表 P1、P2、...、Pk 和一个文本字符串T,目标是确定哪些子字符串出现在模式字符串中。这是一个经过充分研究的问题,并且有一些很好的算法。
如果您有一组固定的模式并且将搜索大量不同的字符串以找到这些模式,那么 Aho-Corasick algorithm是一个很好的解决方案。它对模式字符串进行少量(线性)预处理,以构建一个匹配器,然后可以快速找到可变文本中这些字符串的所有匹配项(时间与要搜索的字符串的长度加上匹配项的数量成线性关系)。这个算法有很多可用的 C++ 实现;检查谷歌的一些例子。
另一方面,如果您有一个固定的字符串和一组可变的模式,您可能需要查看suffix arrays。或 suffix trees ,在对要在其中搜索的字符串进行线性预处理后,它支持对该字符串进行高效(线性或接近线性)搜索以查找您想要的任何模式。
这些算法的缺点是它们有点复杂,除非您真的需要效率,否则您不会编写代码。例如,如果您正在处理长度为数百万个字符的字符串,那么这些方法可能就是您正在寻找的方法。因此,从这个意义上说,如果您正在搜索短字符串,您可能只需使用现有代码就可以摆脱困境,因为它不太可能成为瓶颈并且相当容易理解。