查找字符串是否包含c++中的字符(允许增强)

Find if a string contains a character in C++ (boost allowed)

本文关键字:许增强 增强 字符 是否 字符串 包含 c++ 查找      更新时间:2023-10-16

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

使用std::string::find

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

不可能有更有效的方法了。0 (n)是你能做的最好的。标准库实现应该是最优的。

使用Visual Studio 2013 Compiler完成的源代码经验测试显示,strchr例程比std::string::find实现要快2倍。

加上Tom Tanner的回答。如果你不想做任何先验计算,你将被困在O(n),即在你正在搜索的字符串的长度和时间消耗之间存在线性相关性。Tom建议建立一个布尔值数组(或向量)来指示某个字符是否出现。它将需要O(n)一次来索引字符串,但随后您可以检查O(1)(常量时间)中是否包含任何数量的字符。这种方法的缺点是您将需要大量内存(一旦您决定需要支持unicode)。

作为折衷方案,您可以使用std::set或类似的方法,仅存储输入字符串中实际存在的字符。然后,内存消耗将与字符串中不同字符的数量保持线性关系,但查找将是O(log n),即时间上的对数。

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

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

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

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

找到的字符的位置是

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

只有一种方法。只需遍历字符串以检查您正在查找的字符是否存在。您可以通过使用string::find函数来实现这一点,该函数获取一个字符并返回它在字符串中出现的第一个位置,如果该值不存在,则使用string::npos。您还可以使用std::find,它获得两个迭代器,beginend以及键值'k',并返回指向k在[begin, end]范围内首次出现的迭代器,如果没有找到k,则返回指向end的迭代器。当然,您也可以自己实现find函数,如下所示:

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::findstd::find的更多信息:

  • http://www.cplusplus.com/reference/string/string/find/
  • http://www.cplusplus.com/reference/algorithm/find/

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

你可以试试:

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