目录
string的介绍

string
std命名空间下的类型,是模板类basic_string<char>的别名(通过typedef定义),本质是管理字符数组的对象;
string的使用
1.默认成员函数
构造函数(constructor)

以c++98为例子,这里给出了7种构造方法

(1) empty string constructor (default constructor)
Constructs an empty string, with a length of zero characters.
直接构造一个空串
(2) copy constructor
Constructs a copy of str.
拷贝构造,拷贝一个字符串的值构造
(3) substring constructor
Copies the portion of str that begins at the character position pos and spans len characters (or until the end of str, if either str is too short or if len is string::npos).
这里的pos是从0开始计数,所以复制从pos开始长度为len的字符串,若
str长度不足,或len取值为string::npos,则截取到str的末尾为止。(4) from c-string
Copies the null-terminated character sequence (C-string) pointed by s.
复制指针
s指向的以空字符结尾的字符序列 其实就是复制一个字符串常量(5) from buffer
Copies the first n characters from the array of characters pointed by s.
复制指针
s指向的字符数组中的前n个字符。(6) fill constructor
Fills the string with n consecutive copies of character c.
用
n个连续的字符c填充字符串。(7) range constructor
Copies the sequence of characters in the range [first,last), in the same order.
复制
[first, last)范围内的字符序列,保持原顺序
补充一点刚才上面提到的npos

是std::string的静态成员常量,类型为size_t,值被定义为-1;由于size_t是无符号整数类型,-1会被解释为size_t的最大值。作为字符串成员函数的len(或subLen)参数时,表示 “截取到字符串末尾”;作为返回值时,通常表示 “未找到匹配项”。
析构函数

析构函数在类对象生命周期结束的时候会自动进行调用完成对象中资源清理工作,不需要我们显示调用,了解即可。
赋值运算符重载


第一种是给变量复制字符串常量
第二种其实就是正常的字符串
第三种是单个的字符常量
2.迭代器的使用
begin
end
rbegin
rend




对
string而言,其迭代器本质通常是指针;但其他容器的迭代器不一定是指针(需根据容器实现而定)。使用迭代器时需声明其所属类的作用域(如std::string::iterator),因为不同类的迭代器类型不同。通过begin()/end()(正向迭代器)、rbegin()/rend()(反向迭代器)获取string的字符迭代器;提供统一的方式访问、修改容器数据;可配合算法使用(例如reverse(s.begin(), s.end())用于反转字符串)。迭代器是 C++ 容器与算法交互的核心接口,
string的迭代器设计使其能适配标准库
//迭代器使用的默认格式
string::iterator it = s1.begin();
while (it != s1.end())
{
cout << *it;
it++;
}
普通类型的迭代器可以进行访问和修改对象中的元素

注:end是指向结尾的下一个元素,所以是左闭右开
2.const类型的迭代器只能访问对象中的元素

反向迭代器

范围for遍历
operator[]
operator<<

operator<<

重载[]的功能
作用:通过数组下标形式访问string对象中的字符,返回字符的引用(普通对象可修改字符,const对象仅能读取)。
本质:string底层基于字符数组实现,[]是对数组访问方式的封装,既兼容了数组的直观操作,也通过引用实现了字符的读写控制。
重载<<的功能
作用:支持直接通过cout输出string对象存储的字符串。
意义:简化了字符串的输出操作,无需手动调用c_str()转换为 C 风格字符串,提升了代码的简洁性。
范围 for 的支持
实现逻辑:范围 for 的底层依赖迭代器,string支持迭代器,因此天然兼容范围 for 语法。
注意事项:若需在范围 for 中修改字符,需将循环变量声明为引用类型(如for (auto& ch : str)),否则仅会操作字符的副本。

3.容量有关的成员函数
size
length
max_size
capacity
reserve
clear
empty
shrink_to_fit

size()与length()
功能:两者作用完全一致,均返回字符串中有效字符的数量(不含末尾自动添加的\0)。
使用场景:日常开发中可互换,是获取字符串实际长度的常用接口。
max_size()
功能:返回当前string对象理论上能存储的最大字符数(受编译器、系统内存限制)。
使用场景:实际开发中极少用到,通常无需关注此值,仅作底层实现的参考。
capacity()
功能:返回string底层字符数组已分配的空间大小(注意:实际分配的空间会比显示值多 1,用于存储末尾的\0)。
核心特点:capacity是已分配的内存空间,并非实际使用的字符数(size是实际使用数),体现了string的 “预分配内存” 机制(避免频繁扩容)。
clear()
功能:清空字符串中的有效字符(使size变为 0),但不会改变底层数组的空间大小(capacity保持不变)。
注意:此函数仅重置有效字符的计数,不释放已分配的内存。
empty()
功能:判断字符串是否为空(size为 0 时返回true,否则返回false)。
优势:比size() == 0的写法更简洁、可读性更高,是判断空字符串的推荐方式。
shrink_to_fit()
功能:尝试将capacity缩小至与size一致,以释放未使用的内存。
使用限制:受平台内存对齐规则影响,可能无法完全缩容至size(可能略大于size);实际开发中使用场景极少,仅在需要严格控制内存时考虑。


可以观察到实际s的底层给到了16,因为编译器默认在字符串的最后加入了一个’\0’,在使用capacity获取底层空间总大小的时候会默认将字符串后面的第一个’\0’进行忽略
resize

1. 当指定字符数 > 当前有效字符数
填充规则:若未指定填充字符,默认用'\0'追加到原字符串后;若指定了字符(如resize(10, 'a')),则用该字符追加。
内存处理:若当前capacity不足容纳新字符数,会自动扩容底层空间,保证新字符能存入。
效果:最终size变为指定字符数,capacity不小于新size。
2. 当指定字符数 < 当前有效字符数
截断规则:直接截断字符串,保留前 N 个字符(N 为指定数),超出部分用'\0'覆盖(仅修改size计数,不改变底层字符数组内容)。
内存处理:底层空间(capacity)保持不变,不会释放未使用的内存。
效果:最终size变为指定字符数,capacity维持原值。

reserve

reserve是预分配字符串底层空间的接口,仅影响capacity(空间大小),不改变size(有效字符数),具体行为分两种情况:
当预分配空间 > 当前capacity:
一次性扩容到底层空间至不小于预分配值的大小(实际空间可能略大于预分配值,由编译器内存对齐规则决定)。
用途:提前预留足够空间,避免后续添加字符时多次扩容(每次扩容需拷贝旧数据,会降低效率),适用于已知字符串最终大致长度的场景。
当预分配空间 ≤ 当前capacity:
底层空间保持不变,不会缩容或修改已有空间。
假定你知道要开100个空间大小,但是不使用reserve成员函数,那么会造成频繁扩容

假定你知道要开100个空间大小,使用reserve成员函数,可以一次性将空间开好,那么会避免频繁扩容,提高效率

4.元素访问
operator[]

string重载[]后,可像数组一样通过下标访问字符:
返回字符的引用:普通string对象可通过[]修改对应字符(如s[0] = 'A');
const string对象:仅能读取字符,无法修改(引用为const类型)。
越界行为的风险
当下标超出字符串有效范围(即下标 ≥ size())时:
标准未定义该行为(属于非法操作);
在 VS 的Debug 版本中:会触发断言(Assert)检测越界,直接终止程序并报错;
在 VS 的Release 版本中:断言检测失效,越界访问会读取 / 修改非法内存,可能导致程序崩溃、数据损坏等不可预测的结果。
关键提示
operator[]不做安全越界检查(Release 版本),实际开发中若需安全访问,建议使用at()成员函数(at()会在越界时抛出out_of_range异常,无论编译版本)。
at

at()用于通过下标访问string的字符,行为与operator[]类似:
返回对应下标的字符引用:普通string对象可读写字符,const对象仅能读取;
核心区别:at()会主动检查下标合法性。
越界处理逻辑
当下标超出有效范围(≥size())时:
at()会抛出std::out_of_range异常,而非产生未定义行为;
可通过try-catch捕获异常,记录错误信息并进行容错处理,避免程序崩溃。

5. 用于修改的成员函数
operator+=

operator+=是string中用于追加内容的重载运算符,支持三种追加类型:
追加单个字符(如char类型);
追加 C 风格字符串(如const char*类型);
追加另一个string对象的内容。

append

| 重载类型 | 功能描述 |
|---|---|
(1)append(const string& str) | 追加整个string对象str的内容 |
(2)append(const string& str, size_t subpos, size_t sublen) | 追加str的子串:从str的subpos下标开始,取sublen长度的字符 |
(3)append(const char* s) | 追加 C 风格字符串s(以\0结尾)的全部内容 |
(4)append(const char* s, size_t n) | 追加 C 风格字符串s的前n个字符(即使s长度不足n也仅取实际长度) |
(5)append(size_t n, char c) | 追加n个重复的字符c |
(6)append(InputIterator first, InputIterator last) | 追加迭代器范围[first, last)内的字符(支持其他容器如vector<char>的内容) |

push_back
pop_back



assign

(1) string
Copies str.
复制字符串 str
(2) substring
Copies the portion of str that begins at the character position subpos and spans sublen characters (or until the end of str, if either str is too short or if sublen is string::npos).
复制字符串str中从字符位置subpos开始、长度为sublen个字符的部分(如果str过短或sublen为string::npos,则复制到str的末尾)
(3) c-string
Copies the null-terminated character sequence (C-string) pointed by s.
复制由s指向的以空字符结尾的字符序列(C字符串)
(4) buffer
Copies the first n characters from the array of characters pointed by s.
从s所指向的字符数组中复制前n个字符
(5) fill
Replaces the current value by n consecutive copies of character c.
用字符c的n个连续副本替换当前值
(6) range
Copies the sequence of characters in the range [first,last), in the same order.
复制[first, last)范围内的字符序列,保持原顺序不变

insert


erase

序列删除(参数为位置和长度)
函数原型:
string& erase (size_t pos = 0, size_t len = npos);功能:从位置
pos开始,删除len个字符;若len为npos(默认值),则删除从pos到字符串末尾的所有字符。单个字符删除(参数为迭代器)
函数原型:
iterator erase (iterator p);功能:删除迭代器
p指向的字符,返回指向被删除字符后一个字符的迭代器。范围删除(参数为迭代器区间)
函数原型:
iterator erase (iterator first, iterator last);功能:删除
[first, last)区间内的所有字符,返回指向last原位置的迭代器。

swap

字符串交换

6. 字符串操作
c_str

c_str 将string类对象管理的字符串转换为c语言格式中的字符串,将字符串的地址进行返回
注意string是一个类其实

find

- string (1):查找另一个
std::string对象 - c-string (2):查找 C 风格字符串(
const char*) - buffer (3):查找 C 风格字符串的前
n个字符 - character (4):查找单个字符
核心功能是从指定位置(默认从 0 开始)查找目标内容,返回首次匹配的起始下标;若未找到,返回std::string::npos。各重载的区别在于 “目标内容的类型”:

rfind

和find一样只不过是反向的
substr

从pos位置开始,截取len个字符(若剩余字符不足len,则截取到字符串末尾),返回新的子串对象。

网址解析
7. 非成员函数的重载
operator+

string 与 string 拼接对两个std::string对象进行拼接,返回合并后的新字符串。
string 与 C 风格字符串拼接支持std::string与const char*类型的双向拼接(std::string在前或在后),兼容 C 风格字符串的使用场景。
string 与单个字符拼接支持std::string与char类型的双向拼接,可快速在字符串首尾添加单个字符。

其他关系比较的就不一一列举了

operator<<

operator>>

getline

带自定义分隔符
从输入流is读取字符,存入str,直到遇到delim(分隔符)为止(分隔符会被读取但不存入str)。
默认分隔符(换行符)
等价于getline(is, str, '\n'),即读取到换行符为止,用于获取完整的一行输入。


1591

被折叠的 条评论
为什么被折叠?



