💬 欢迎讨论:在阅读过程中有任何疑问,欢迎在评论区留言,我们一起交流学习!
👍 点赞、收藏与分享:如果你觉得这篇文章对你有帮助,记得点赞、收藏,并分享给更多对C++感兴趣的朋友
文章目录
前言
接下来我们开始STL的学习之旅,进一步感受C++的给世界带来的编程盛宴。
本章的学习目的:
- 了解我们为什么要学习string类
- 了解标准库中的string类有哪些功能
- 可以得心应手地使用string类
声明:本文只介绍string类中我们常用的功能。
学习建议:
- 建议先大致阅读string类文档,大概知道string类中有哪些内容即可:🖱string
- 下文中会讲解string类常用的部分接口。有些我会直接提供接口文档链接,点击进入即可。还有些我会提供图片目录,进入我给出的string类文档对应查找即可。建议在看完我的讲解后去阅读相应文档,学习效果更好哦!
一、string类 VS 字符串
在C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,并且内存存储空间需要自己开辟,麻烦且容易出错,稍不留神可能还会越界访问。
以字符串的拼接为例:
用普通字符串我们要这样写代码:
#include<iostream>
using namespace std;
int main()
{
char str1[10] = "wo xiang"
char str2[20] = " chi yu"
//拼接
strcat(str1, str2);
cout << str1 << endl;
return 0;
}
当我们用string类时:
#include <iostream>
#include <string>
using namespace std;
int main() {
string str1 = "wo xiang";
string str2 = " chi yu";
// 使用 += 操作符进行拼接
str1 += str2;
cout << str1 << endl;
return 0;
}
string类的优势显而易见。
二、标准库中的string类
1. string类的常用接口
1.1 string类对象的构造
string():构造空的string对象,即空字符串
string s1;// 构造空的string类对象s1
string(const char* s):用普通字符串来构造string对象
string s2("hello world");// 用C格式字符串构造string类对象s2
string(const string& str):拷贝构造
string s3(s2);// 拷贝构造s3
string(size_t n, char c):在string类对象中构造n个字符c
string s4(6, x); //s4:xxxxxx
1.2 string类对象的容量操作
| 函数 | 功能描述 |
|---|---|
size() | 返回字符串有效字符长度 |
length() | 返回字符串有效字符长度 |
capacity() | 返回空间总大小(容量) |
empty() | 检测字符串是否为空,是返回true,否则返回false |
clear() | 清空有效字符 |
reserve(size_t res_arg = 0) | 为字符串预留空间 |
resize(size_t n) resize(size_t n, char c) | 将有效字符个数改为n,多余的空间用字符c覆盖 |
💡提示:
length()与size()是完全相同的,但建议用size(),因为为了和其他容器保持一致clear()只是将有效字符清空,不会改变底层空间大小(capacity())reserve(size_t res_arg=0)为string预留空间,不改变元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小;大于时就会扩大容量大小。resize(size_t n)与resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是:
resize(size_t n)用0来填充多出的元素空间resize(size_t n, char c)用字符c来填充多出的元素空间
注意:resize在改变元素个数时,如果是将元素个数增多,会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
- 对string操作时,如果能够大概预估到放多少字符,可以先通过
reserve把空间预留好。
1.3 string类对象的访问及遍历


| 函数 | 功能描述 |
|---|---|
operator[] | 返回或设置指定位置的字符 |
at() | 返回指定位置的字符并进行边界检查 |
begin()与end() | 返回字符串的首尾迭代器,用于正向遍历字符串 |
rbegin()与rend() | 返回字符串的首尾迭代器,用于反向遍历字符串 |
| 范围for | C++11支持更简洁的范围for的新遍历方式 |
at()了解了解就行,平时基本用不上
迭代器iterator:
string::iterator it = s1.begin();
while(it != s1.end())
{
cout << *it << " ";
++it;
}
cout << endl;
可以看到,iterator好像是像指针一样的类型。其实,他有可能是指针,也有可能不是指针。(至于为什么,就需要剖析其底层代码深入学习了,建议初学者先放一放)
总之,iterator是提供一种统一的方式去访问和修改容器的数据。
此外,还有反向迭代器reverse_iterator,原理相同。
1.4 string类对象的修改操作

| 函数 | 功能描述 |
|---|---|
push_back(char c) | 在字符串后尾插一个字符c |
append(const char& str) 或append(const char* s) | 在字符串后追加一个字符串 |
operator += | 在字符串后追加字符串str |
insert | 在字符串任意位置插入字符或字符串,用法详见insert |
erase | 删除字符串任意位置部分,用法详见erase |
replace | 替换字符串的一部分:replace |
pop_back() | 尾删一个字符 |
这里主要重点掌握 operator +=,其他了解即可。
注意:
- 在
string尾部追加字符时,s.push_back(c) / s.append(1, c) / s += 'c'三种的实现方式差不多。但一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
1.5 字符串查找函数
| 函数 | 功能描述 |
|---|---|
find () | 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 |
rfind() | 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 |
find_first_of() | 查找字符集中的任意字符,返回第一次出现的pos位置 |
find_last_of() | 查找字符集中的任意字符,返回最后一次出现的pos位置 |
- 字符集就是字符集合
💡:这里函数的参数涉及string::npos,它是string类的一个常量静态成员变量。通常,它的值是一个最大的无符号整数(size_t)-1。
一般用来做查找失败的返回值。

1.6 字符串截取函数
substr: 在str中从pos位置开始,截取n个字符,然后将其返回
string substr (size_t pos = 0, size_t len = npos) const;
1.7 string对象转化为字符串指针操作
c_str:返回C格式的字符串(char*指针)
const char* c_str() const;
1.8 字符串与数值转换操作
| 函数名 | 功能说明 | 文档链接 |
|---|---|---|
to_string() | 将数值转换为字符串 | 文档 |
stoi() | 将字符串转换为整数 | 文档 |
stof() | 将字符串转换为浮点数 | 文档 |
1.8 string类的非成员函数

| 函数 | 描述 |
|---|---|
operator== | 判断两个字符串是否相等 |
operator!= | 判断两个字符串是否不相等 |
operator< | 判断当前字符串是否小于另一个字符串 |
operator> | 判断当前字符串是否大于另一个字符串 |
compare() | 进行详细的字符串比较,返回 0 表示相等,负值表示小于,正值表示大于 |
getline | 在我们输入字符串中时,如果中间有空格,cin就会停止读取,这时就需要用到这个函数,该函数默认换行结束输入,也可以自己设置符号,注意只能用于字符串输入 |
2.string类 总结
string是表示字符串的字符串类- 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作
string的常规操作。 - string在底层实际是:
basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string; - 不能操作多字节或者变长字符的序列。



3652

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



