查找字符串是否包含C ++中的字符(允许提升)

时间:2012-12-25 06:40:24

标签: c++ string boost

假设我有一个字符串,我想查找是否存在特定字符(如“|”),这样做的最佳和最快技术是什么?我知道字符串查找实现。我要求比这更快的实现。

7 个答案:

答案 0 :(得分:31)

使用std::string::find

if (str.find('|') != std::string::npos)
{
    // ...
}

不太可能有更高效的东西。 O(n)是你能做的最好的。标准库的实现应该非常优化。

答案 1 :(得分:2)

使用Visual Studio 2013 Compiler进行的this source经验测试显示 strchr 例程比 std :: string :: find 快2倍 实施。

答案 2 :(得分:1)

另一种方法是在相应的c_str字符串上使用strchr函数:

if(strchr(str.c_str(), '|'))
{
    \\found
}

不确定它在速度方面与std find相比如何......

找到的角色的位置是

size_t pos = strchr(str.c_str(),'|') - str.c_str();

答案 3 :(得分:1)

添加Tom Tanner的答案。如果您不想进行任何先验计算,则会陷入O(n),即您要搜索的字符串的长度与时间消耗之间存在线性相关性。汤姆建议设置一个布尔数组(或矢量),指示某个字符是否出现。它需要O(n)一次索引字符串,但是如果包含它,你可以检查O(1)中的任意数量的字符(恒定时间)。这种方法的缺点是你需要大量的内存(一旦你决定需要支持unicode)。

作为妥协,你可以使用std :: set或类似的东西,只存储输入字符串中实际存在的字符。然后,内存消耗将与字符串中不同字符的数量成线性关系,但查找将为O(log n),即时间对数。

当然,您应该测量/分析,然后在这里解释您实际优化的用例。在你这样做之前,坚持使用最容易理解和阅读的内容。

答案 4 :(得分:0)

只有一种方法可以做到这一点。只需遍历字符串以检查您要搜索的字符是否存在。您可以使用string::find函数执行此操作,该函数获取一个字符并返回它在字符串中出现的第一个位置,如果该值不存在则返回string::npos。您还可以使用std::find,它获取两个迭代器beginend以及一个键值'k',并返回一个迭代器,指向范围{{1}中第一次出现的k如果找不到[begin, end],则为end。当然,您可以自己实现查找功能,如下所示:

k

或者这个:

string::size_type pos=string::npos;
for(string::size_type i=0; i<s.size(); ++i) {
  if(s[i] == key) {
     pos=i;
     break;
  }
}
if(pos != string::npos) {
  // key was found
} else {
  // not found
}

有关string::iterator pos=s.end(); for(string::iterator i=s.begin(); i!=s.end(); ++i) { if(*i == key) { pos=i; break; } } if(pos != s.end()) { // found } else { // not found } std::string::find的更多信息:

答案 5 :(得分:0)

鉴于你声明你想要比string :: find更快的东西,我唯一能想到的就是创建一个具有高度自定义赋值运算符的类,在每次更新字符串时都会更新一个内部表,其中包含每个可能字符的字符串中的第一个位置(char字符串为256,宽字符串为65536(?))。这有O(1)查找,代价是增加了非常规操作的相当多的复杂性。

答案 6 :(得分:0)

你可以试试这个:

   string s1 = "Hello";
   string s2 = "el";
   if(strstr(s1.c_str(),s2.c_str()))
   {
    cout << " S1 Contains S2";
   }