查找字符串是否包含c++中的字符(允许增强)
Find if a string contains a character in C++ (boost allowed)
假设我有一个字符串,我想找到一个特定的字符(如'|')是否存在,最好和最快的技术是什么?我知道字符串查找实现。我要求比这个更快的实现
使用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
,它获得两个迭代器,begin
和end
以及键值'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::find
和std::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";
}
- 无法将结构注册为增强几何体3D点
- 增强基于 XML class_id的反序列化
- 增强精神解析器规则以检测语句中的特殊结尾
- C++ 使用增强正则表达式库时断言崩溃
- 增强精神 X3:错误:在"..."中没有名为"大小"的类型
- 如何包装(撰写)增强 hana 地图并访问括号运算符(运算符 [])?
- 有没有办法在C ++中检测汉字?(使用增强)
- 如何将增强MSM与增强信号结合使用?
- 如何使用增强::几何计算多边形的旋转固体体积?
- 复制部分文件的C++/增强方式
- 增强 ASIO 和串行端口异步读取
- 增强 Hana index_if和类型
- 增强超几何测试
- 如何修改增强 hana 结构的成员
- 增强纤维work_stealing屏障会导致段错误
- 增强循环缓冲区push_back在前面插入数据
- 彩色增强::日志显示偏移的颜色
- 增强序列化,按基类型加载存档类会产生错误的数据
- C++构建增强 1.57.0 VS2013 x64 本机工具命令提示符
- 增强二进制存档 - 减小大小