【C++】对于string的学习

简介: 【C++】对于string的学习

前言

本篇文章针对C++中的string做一些详细的介绍和学习,并且会包含一些关于STL的介绍

注意:

本篇文章只包含基础知识

STL

STL是标准模板库的一个缩写,全称是Standard Template Library

string

C++中定义了一种类,为string,存放在头文件<string>中

存放C语言风格字符串的头文件是<cstring>,也就是以’\0’为结尾的字符数组

C语言的字符串的对比与string

指针与类

char*是指针,而string是一个类

在string中封装了char*,管理这个字符串,是一个char*类型的容器

功能的多少

string封装了很多实用的成员方法

比如:查找find、拷贝copy、删除erase、替换replace、插入insert

不用考虑内存释放和越界

string管理char*对所分配的内存,每一次string的复制/赋值,取值都由string类负责维护,不用担心复制越界和取值越界等问题。

API

API是应用程序接口(Application Programming

Interface),是STL提供给用户使用的接口,一般表现为公共成员函数和重载操作符

string的十个API(功能)

构造

下面介绍构造的四种用法

string();
//默认构造函数,作用是创建一个空的字符串
string(const string& str);
//拷贝构造函数,使用一个string对象初始化另一个string对象
string(const char* s);
//含参构造函数,使用C语言风格字符串初始化
string(int n, char c);
//含参构造函数,使用n个字符C初始化

赋值

重载赋值操作符=
string& operator=(const char* s);
//C风格的字符串赋值给当前的字符串
string& operator= (const string& s);
//把字符串s赋给当前的字符串
string& operator=(const char c);
//字符串赋值给当前的字符串
成员函数assign
string& assign(const char* s);
//C风格字符串赋值给当前的字符串
string& assign(const char* s.int n);
//把C风格的字符串s的前n个字符赋给当前的字符串
string& assign(const string& s);
//把字符串s赋给当前字符串
string& assign(int n, char c);
//把n个字符c赋给当前的字符串
string& assign(const string& s, int start, int n);
//将字符串s中从start开始的n个字符赋值给当前的字符串

存取

string& assign(const char* s);
//C风格字符串赋值给当前的字符串
string& assign(const char* s.int n);
//把C风格的字符串s的前n个字符赋给当前的字符串
string& assign(const string& s);
//把字符串s赋给当前字符串
string& assign(int n, char c);
//把n个字符c赋给当前的字符串
string& assign(const string& s, int start, int n);
//将字符串s中从start开始的n个字符赋值给当前的字符串

重载下表获取操作符[]

char& operator[](int n);
//通过[]以访问下标的方式获取字符

注意:

当使用下标操作符获取字符时,如果下标越界,程序将会强制终止

成员函数at

char& at(int n);
//通过at方式获取字符

注意:

使用at方法获取字符时,如果下标越界,at方法内部会抛出异常,可以使用try-catch捕获并处理该异常

需要包含头文件<stdexception>

拼接

重载复合操作符+=

string & operator+=(const string% str);
//将字符串str追加到当前字符串末尾
string& operator+=(const char* str);
//将C风格字符数组追加到当前字符串末尾
string& operator+=(const char c);
//将字符c追加到当前字符串末尾

成员函数append

string& append(const char* s);
//把C风格字符数组s连接到当前字符串结尾
string& append(const char* s, int n);
//把C风格字符数组s的前n个字符连接到当前字符串结尾
string& append(const string& s);
//将字符串s追加到当前字符串末尾
string& append(const string& s, int pos, int n);
//把字符串s中从pos开始的n个字符连接到当前字符串结尾
string% append(int n, char c);
//在当前字符串结尾添加n个字符c

查找

成员函数find

int find(const string& str, int pos = 0)const;
//查找str在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0
int find(const char* s, int n = 0)const;
//查找C风格字符串s在当前字符串中第一次出现的位置,从pos开始查找,pos默认为0

详细解释:

当查找失败时,find方法返回 - 1, - 1已经被封装为string的静态成员常量string::npos

static const size_t npos = -1;

find方法通常查找字符串第一次出现的位置,而rfind2方法通常查找字符串最后一次出现的位置

成员函数rfind

这里可以联系上面的find函数帮助理解

int rfind(const string& str, int pos = npos)const;
//从pos开始向左查找最后一次出现的位置,pos默认是npos
int rfind(const char* s, int pos = npos)const;
//查找s最后一次出现的位置,从pos开始向左查找,pos默认为npos
int rfind(const char* s, int pos, int n)const;
//从pos开始想做查找s的前n个 字符最后一次出现的位置
int rfind(const char c, int pos = npos)const;
//查找字符c最后一次出现的位置

注意:

rfind(str, pos)的实际的开始位置是pos + str.size(),即从该位置开始(不包含该位置字符)向前寻找匹配项,

如果有则返回字符串位置,如果没有则返回string::npos

关于string::npos

我们都知道 - 1 是size_t类的最大值,

所以string::npos其实就表示“直到字符串结束”,这样就可以理解rfind中pos的默认参数是npos了

同时,我们也可以发现string::npos和container.end()迭代器(没学过)其实是相同含义的,说明我们STL各个模块的设计是统一的

替换

成员函数replace

string & replace(int pos, int n, const string & str);
//替换从pos开始n个字符为字符串s
string& replace(int pos, int n, const char* s);
//替换从pos开始的n个字符为字符串s
string& replace(int pos, int n, const char* s);
//替换从pos开始的n个字符为字符串s

成员函数compare

int compare(const string& s)constl
//与字符串s比较
int compare(const char* s)const;
//与C风格字符数组比较

注意:

compare函数依据字典序(即字母顺序)进行比较

当当前字符串小于给定字符串时,返回 - 1、当当前字符串比给定字符串大时,返回1、相等返回0

重载比较操作符

有 > < >= <= == !=

子串

成员函数substr

string substr(int pos = 0; int n = npos)const;
//返回由pos开始的n个字符组成的字符串

解释:

string::npos的含义是截取到整个字符串结束

插入

成员函数insert

string& insert(int pos, const char* s);
//在pos位置插入C风格字符数组
string& insert(int pos, const string& str);
//在pos位置插入字符串str
string& insert(int pos, int n, char c);
//在pos位置插入n个字符c

删除

成员函数erase

string& erase(int pos, int n = npos);
//删除从pos位置开始的n个字符

解释:

string::npos的含义是截取到整个字符串结束

结语

本篇文章只介绍了string的使用知识

至于相关的例题,则会在之后其他的专栏里记录和总结


相关文章
|
10月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
6月前
|
对象存储 C++ 容器
c++的string一键介绍
这篇文章旨在帮助读者回忆如何使用string,并提醒注意事项。它不是一篇详细的功能介绍,而是一篇润色文章。先展示重载函数,如果该函数一笔不可带过,就先展示英文原档(附带翻译),最后展示代码实现与举例可以直接去看英文文档,也可以看本篇文章,但是更建议去看英文原档。那么废话少说直接开始进行挨个介绍。
140 3
|
10月前
|
C++
模拟实现c++中的string
模拟实现c++中的string
|
12月前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
277 4
2023/11/10学习记录-C/C++对称分组加密DES
|
11月前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
169 16
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
522 5
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
451 2
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
508 6
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
138 1