C++中的字符串操作<cstring>和<string>的区别

简介: 目录目录参考资料字符串cstring和string的区别在哪string类的实现 注意不要盲目相信以下内容! 不要盲目相信以下内容! 不要盲目相信以下内容! (重要的事情说三遍),虽然以下内容也经过了我的验证,但是我的验证可能有错误的地方,欢迎大家留言告知。

目录


注意不要盲目相信以下内容! 不要盲目相信以下内容! 不要盲目相信以下内容! (重要的事情说三遍),虽然以下内容也经过了我的验证,但是我的验证可能有错误的地方,欢迎大家留言告知。希望这篇文章成为你深入探索相关领域的引子启发,而不是标准答案


参考资料

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 不必担心内存是否足够和字符串长度的同时,你必须放弃严格控制其内存申请释放的想法。


目录
相关文章
|
19小时前
|
C++ 容器
黑马c++ STL部分 笔记(2) string容器
黑马c++ STL部分 笔记(2) string容器
|
1天前
|
存储 NoSQL 关系型数据库
Redis -- String 字符串, 计数命令,字符串操作
Redis -- String 字符串, 计数命令,字符串操作
8 0
|
1天前
|
Java C++ Python
C++ 使用getline()从文件中读取一行字符串
`getline()` 是 C++ 中 `istream` 类的一个方法,被 `fstream` 和 `ifstream` 继承,用于从文件中读取一行字符串。它有两种语法:一种是从文件读取 `bufSize-1` 个字符到 `buf` 直到 `\n`,另一种是读到指定分隔符 `delim`。如果文件中的字符数量超过 `bufSize`,会导致读取失败。示例代码展示了如何使用 `getline()` 读取和打印文件内容。通过循环调用 `getline()`,可以连续读取文件的多行数据。
9 0
|
3天前
|
存储 编译器 程序员
C++中的宏定义和字符串字面值的区别
C++中的宏定义和字符串字面值的区别
|
3天前
|
C语言 C++
从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法(下)
从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法
13 0
|
3天前
|
存储 C语言
从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法(中)
从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法
8 0
|
3天前
|
存储 编译器 测试技术
从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法(上)
从C语言到C++_13(string的模拟实现)深浅拷贝+传统/现代写法
11 0
|
3天前
|
机器学习/深度学习 canal NoSQL
从C语言到C++_12(string相关OJ题)(leetcode力扣)
从C语言到C++_12(string相关OJ题)(leetcode力扣)
9 0
|
3天前
|
编译器 测试技术 C语言
从C语言到C++_11(string类的常用函数)力扣58和415(下)
从C语言到C++_11(string类的常用函数)力扣58和415
4 0
|
3天前
|
存储 编译器 C语言
从C语言到C++_11(string类的常用函数)力扣58和415(中)
从C语言到C++_11(string类的常用函数)力扣58和415
7 0