接下来我们开始STL的学习之旅,进一步感受C++的给世界带来的编程盛宴。 本章的学习目的:
声明:本文只介绍string类中我们常用的功能。 学习建议:
在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():构造空的string对象,即空字符串string s1;// 构造空的string类对象s1string(const char* s):用普通字符串来构造string对象string s2("hello world");// 用C格式字符串构造string类对象s2string(const string& str):拷贝构造string s3(s2);// 拷贝构造s3string(size_t n, char c):在string类对象中构造n个字符cstring s4(6, x); //s4:xxxxxx
函数 | 功能描述 |
|---|---|
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在改变元素个数时,如果是将元素个数增多,会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。reserve把空间预留好。

函数 | 功能描述 |
|---|---|
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,原理相同。

函数 | 功能描述 |
|---|---|
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类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。函数 | 功能描述 |
|---|---|
find () | 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置 |
rfind() | 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置 |
find_first_of() | 查找字符集中的任意字符,返回第一次出现的pos位置 |
find_last_of() | 查找字符集中的任意字符,返回最后一次出现的pos位置 |
💡:这里函数的参数涉及string::npos,它是string类的一个常量静态成员变量。通常,它的值是一个最大的无符号整数(size_t)-1。
一般用来做查找失败的返回值。

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

函数 | 描述 |
|---|---|
operator== | 判断两个字符串是否相等 |
operator!= | 判断两个字符串是否不相等 |
operator< | 判断当前字符串是否小于另一个字符串 |
operator> | 判断当前字符串是否大于另一个字符串 |
compare() | 进行详细的字符串比较,返回 0 表示相等,负值表示小于,正值表示大于 |
getline | 在我们输入字符串中时,如果中间有空格,cin就会停止读取,这时就需要用到这个函数,该函数默认换行结束输入,也可以自己设置符号,注意只能用于字符串输入 |
string是表示字符串的字符串类string的常规操作。basic_string模板类的别名,typedef basic_string<char, char_traits, allocator>string;