C++ string类常用接口

本文详细介绍了C++中的string类,包括构造函数、容量函数、访问与遍历操作以及修改操作。讲解了如何创建、操作和管理string对象,如构造空字符串、插入和删除字符、查找子串以及预留和调整容量等。此外,还提到了非成员函数如+运算符和IO操作符的使用,以及string与其他C++容器的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一.string类的常用接口

1.1 string类对象的构造函数

 1.2 string对象的容量函数

 1.3 string类对象的访问及遍历操作

1.4 string类修改操作

 1.5 string 非成员函数


前言

        在C语言中,字符串是以'\0'结尾的一些字符的集合。为了操作方便,C语言中还提供了一些控制字符串的函数例如strcpy,strcmp,strcat等等。但是这些函数与字符串是分离开的,并不符合C++封装的特性。于是C++中由单独产生了一个string类。

说明

        string是一个类,string实例化的对象实际是一个字符数组。

        在string类使用时,必须包含#include<string>头文件和展开命名空间using namespace std。

下面介绍string类的一些常用接口,大部分都是string类的成员函数。如果由什么下面没有提到的接口或者不明白的可以查文档http://www.cplusplus.com/reference/string/

一.string类的常用接口

1.1 string类对象的构造函数

函数名称功能说明
string()无参默认构造函数,构造空string类对象,即空字符串
string(const char * s)用c字符串构造string类对象
string(size_t n,char c)实例化的类对象中包含n个字符c
string(const string& s)拷贝构造函数,将对象s拷贝构造一个新对象

 1.2 string对象的容量函数

函数名称功能说明
size()返回字符串中有效字符长度
length()返回字符串中有效字符长度
capacity()返回空间的总长度,字符长度size超过capacity会自动扩容
empty()检测字符串是否为空串,是返回true,不是返回false
clear()清空有效字符串,空间不释放,内容没改变,只是size变为0
reserve(size_t n=0)为字符串预留空间,就是提前开辟一段你想要大小的空间,如果不用reserve,编译器会自己开辟一段空间。

resize(size_t n,char c)

将有效字符串个数改成n个,n小于size,缩小size到n。n大于size,增大size到n,多出来的空间用字符c填充,不给c,用'\0'填充

 注意:length和size底层实现是一样的,引入size的原因是为了与其它容器保持一致,一般情况下用size。

 clear()函数只是将对象的size置0,不改变底层空间大小。

 resize(size_t n,char c),当n小于对象size时,直接改变对象的size到n。当n大于对象size时,直接增大对象size到n,多出来的空间用给的字符c填充,没给字符c默认用\0填充。

 reserve是提前将对象capacity空间直接开辟到某一值。如果reserve里的值开辟空间小于capacity值,不会改变capacity。size始终都不会改变。

为什么上面代码reserve(50),会扩容到63。因为字符保存时存在一定的内存对齐,一般时某一值的正数倍。

这样看下面一个代码:

 如果提前知道套插入多少字符,提前开辟空间,防止扩容效率损失。

 1.3 string类对象的访问及遍历操作

函数名称功能说明
operator[](size_t pos)[]操作符重载函数,返回pos位置字符
begin()获取第一个字符位置的迭代器
end()获取最后一个字符下一个位置的迭代器
rbegin()和end一样
rend()和begin一样
范围forC++11支持的一种更简洁的范围for的新遍历方式

说明: 

  1. 因为重载了[]操作符,可以直接用对象+[],就像数组的形式访问字符。
  2. 迭代器现在的理解:string类里含有一个迭代器,所以定义一个迭代器要声明是string类里的,begin和end返回的是迭代器,可以用迭代器接收或者作比较。有不足请提出。

1.4 string类修改操作

函数名称功能
push_back(char c)在字符串尾插字符
append(const char * s)在字符串尾插字符串
operator+=(常用)在字符串尾插字符或字符串
c_str返回c格式字符串
find(char c,size_t pos)在字符串pos位置开始往后找字符或字符串,返回该字符在字符串中第一次出现位置,不输入位置默认从开始往后找
rfind在字符串pos位置开始往前找字符或字符串,返回该字符在字符串中第一次出现位置,不输入位置默认从后往前找
substr(size_t pos,szie_t len)在字符串中从pos位置开始,截取len个字符,然后返回
nposstring的静态成员变量,static const size_t npos=-1;全1,size_t为无符号整形,实际40几亿

 push_back在字符串后尾插字符,append在对象后尾插字符串,+=重载即可尾插字符又可尾插字符串,所以常用+=。

 这样看不出什么不同,但是看下面这样。

由于c语言字符串以\0结尾所以ret只打印了hello,但是打印对象也没有将\0打印出来,这是因为有的字符在输出框是不可见的\0就属于不可见的。

 

 补充:

函数名称功能
insert(pos,char * s)在pos位置插入字符或者有效字符串
erase(pos,n)在pos位置删除n个字符

 1.5 string 非成员函数

函数功能
operator+一对象加上字符或者字符串,返回一对象,对象自身不改变。少用,返回不是引用。效率低
operator<<输出操作符重载函数
operator>>输入操作符重载函数
getline(cin,对象)获取一行字符,包括空格。
relational operators (string)比较大小

cin输入遇到空格,换行结束。getline遇到换行结束。

### C++ 中 `std::string` 常用方法和接口 #### 创建字符串对象 可以使用多种方式创建 `std::string` 对象: ```cpp #include <string> using namespace std; // 默认构造函数 string s1; // 使用常量字符数组初始化 string s2 = "hello"; // 复制构造函数 string s3(s2); // 构造 n 个 c 字符组成的字符串 string s4(5, 'a'); ``` #### 访问元素 提供了几种访问单个字符的方法: - `operator[]`: 支持范围外访问,不抛异常[^2] - `at()`: 越界检查严格,超出范围会抛出 `out_of_range` 异常[^2] ```cpp char ch1 = str[0]; // 不做边界检测 char ch2 = str.at(0); // 进行越界保护 ``` #### 修改操作 支持各种修改字符串内容的操作: - `append()` 或者 `+=` : 添加新内容到现有字符串后面 - `insert(pos, str)` : 插入子串至指定位置 - `erase(start[, count])` : 删除部分字符 - `replace(start, length, newstr)` : 替换特定区域的内容 ```cpp s.append(" world"); // 直接追加 s.insert(5," dear "); // 在第5位前插入" dear " s.erase(6,4); // 移除从索引6开始长度为4的部分 s.replace(6,7,"everybody");// 将某一段替换掉 ``` #### 查找功能 提供了一系列用于搜索模式匹配的功能: - `find(sub,[pos])` / `rfind(sub,[pos])` :从前向后/从后向前寻找首次出现的位置 - `find_first_of/ch/sub(str,[pos])` : 寻找任意一个目标字符第一次出现的地方 - `find_last_of/ch/sub(str,[pos])` : 找到最后一次出现的目标字符所在位置 ```cpp size_t pos = str.find("world"); if (pos != string::npos){ cout << "Found at position:" << pos; } ``` #### 子串提取 可以通过以下两种方式获取子串: - `substr([start],[len])` : 提取[start,start+len)之间的字串 ```cpp string sub = long_string.substr(8,9); ``` #### 非成员函数重载运算符 为了方便处理字符串比较和其他常见需求,还重载了一些常用的二元运算符: - 关系运算符 (`==`, `<`, etc.) - 输入输出流(`<<`,`>>`) - 拼接连接(`+`) 这些都使得标准库中的字符串更加易于使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值