目录
注意不要盲目相信以下内容! 不要盲目相信以下内容! 不要盲目相信以下内容! (重要的事情说三遍),虽然以下内容也经过了我的验证,但是我的验证可能有错误的地方,欢迎大家留言告知。希望这篇文章成为你深入探索相关领域的引子和启发,而不是标准答案。
参考资料
basic_string
cstring
string类使用
字符串
字符串在C++中由两种形式,第一种为string对象,另一种为char类型的数组即字符数组。
通常以串的整体作为操作对象,如:在串中查找某个子串、求取一个子串、在串的某个位置上插入一个子串以及删除一个子串等。
两个字符串相等的充要条件是:长度相等,并且各个对应位置上的字符都相等。
设p、q是两个串,求q在p中首次出现的位置的运算叫做模式匹配。串的两种最基本的存储方式是顺序存储方式和链接存储方式。
这是一些字符串处理算法,在字符串上进行不同的处理:
字符串查找算法
正则表达式算法
模式匹配
字符串的匹配算法(kmp)
AC自动机
cstring和string的区别在哪?
C++中由C语言的string.h库转的<cstring>
库还有C++的basic_string库<string>
有什么区别和联系?是不是可以理解成<string>
库是包含了一些自定义函数的模板类?
有了<string>
才有了string对象,所以<string>
中主要是操作string对象,而<cstring>
主要以char *类型为参数操作字符数组?
哦,是不是说封装成了类,只有字符串操作函数?
可以看一下以下代码,能够发现一些现象:
#include<iostream>
#include<cstring>
//#include<string>
using namespace std;
int main()
{
string s = "Can you?";
cout << s;//error,没有与std::string匹配的操作符
system("pause");
return 0;
}
当我们只包含了<cstring>
时,这时如果couture<<s;
就会报错,而我们include<string>
后就可以正常运行了,这是为什么呢?
其实这验证了我们之前的猜想,让我们从string的实现来看一下。
string类的实现
C语言的字符串函数,简单而高效。C++ string类,功能强大而复杂(对于我这样的人来讲,复杂了点)。简单的比较没有意义,只是在特定的情况下哪一个更适合的问题。
而在决定哪一个更适合之前,你可能需要明白:
A STL标准模板库中的string类使用异常来传递错误
B STL标准模板库中的string类,是一个具有写时才拷贝(Copy-On-Write)技术的类。Copy-On-Write使用了“引用计数“,在下列情况下会使用Copy-On-Write:1)以别的类构造自己,2)以别的类赋值
(Copy-On-Write另一个被用到的地方是Linux在创建自己的进程时会使用这一技术,感兴趣的同学可以自行查阅相关资料)
C 不必担心内存是否足够和字符串长度的同时,你必须放弃严格控制其内存申请释放的想法。