对于C++中string的详细介绍
开篇介绍:
hello 大家,在前面几篇博客中,我们算是把C++中的入门基础+类和对象+模版初阶成功拿下。
那么,接下来我们就要进入C++中真正的重点中了,STL的使用,那么呢,其实也就是直接使用 C++中所提供的现成的数据结构,比如我们今天要讲的string类。
那么string类呀,是一个非常重要也非常好使的一个数据结构,那么接下来,就让我们来详细了解一下C++中的string类。
string的介绍:
在 C++ 中,std::string 是标准库(STL)提供的字符串类,用于高效管理和操作字符序列。它封装了动态字符数组的逻辑,自动处理内存分配与释放,是 C 语言风格字符数组(char[])的现代化替代方案。以下从定义、特性、操作到高级用法,全面详解 std::string。
一、基本定义与头文件
std::string 位于 头文件中,属于 std 命名空间,其本质是 std::basic_string 的特化版本(针对单字节字符,如 ASCII、UTF-8)。类似的还有宽字符版本:
std::wstring(basic_string):用于宽字符(如 Unicode 16/32 位);std::u16string(C++11,basic_string):UTF-16 编码;std::u32string(C++11,basic_string):UTF-32 编码。
日常开发中最常用的是 std::string(单字节字符),使用前需包含头文件并声明命名空间:
#include
using namespace std; // 或显式使用 std::string
二、核心特性
- 可变性:字符串内容可直接修改(区别于 Python
str、JavaString的不可变性)。 - 动态内存管理:自动扩容 / 缩容,无需手动分配 / 释放内存(避免 C 语言
char[]的内存泄漏风险)。 - 与 STL 兼容:支持迭代器、算法(如
std::reverse、std::find),可作为容器使用。 - 编码无关性:仅管理字节序列,不直接处理编码(需结合外部逻辑处理 UTF-8 等多字节编码)。
三、初始化与构造
std::string 提供多种构造方式,覆盖不同场景:
| 构造方式 | 示例代码 | 说明 |
|---|---|---|
| 默认构造 | string s; | 空字符串(长度 0,容量可能为 0 或默认值)。 |
| C 字符串初始化 | string s("hello"); 或 string s = "hello"; | 用 C 风格字符串(const char*)初始化。 |
| 复制构造 | string s1("abc"); string s2(s1); 或 string s3 = s1; | 复制已有字符串。 |
| 截取 C 字符串前 n 个字符 | string s("hello", 3); // 结果:"hel" | 取前 3 个字符(超出原长度则取全部)。 |
| n 个重复字符 | string s(5, 'a'); // 结果:"aaaaa" | 用 5 个 'a' 初始化。 |
| 范围初始化(迭代器) | string s1("hello"); string s2(s1.begin(), s1.begin() + 3); // "hel" | 用另一个字符串的迭代器范围初始化。 |
| 移动构造(C++11) | string s1("hello"); string s2(std::move(s1)); //s1 变为空,s2 为 "hello" | 转移资源,避免复制(高效)。 |
四、基本操作(元素访问与长度)
1. 元素访问
std::string 支持通过索引或迭代器访问字符,常用方式:
operator[]:直接访问索引位置的字符(不检查越界,越界行为未定义)。at(size_t pos):访问索引位置的字符(检查越界,越界抛出std::out_of_range异常)。front()/back():访问第一个 / 最后一个字符(C++11,空字符串调用会导致未定义行为)。- 迭代器:
begin()/end()(正向迭代)、rbegin()/rend()(反向迭代)。
示例:
string s = "hello";
cout << s[1] << endl; // 'e'(无越界检查)
cout << s.at(2) << endl; // 'l'(有越界检查)
cout << s.front() << endl; // 'h'
cout << s.back() << endl; // 'o'
// 迭代器遍历
for (auto it = s.begin(); it != s.end(); ++it) {
cout << *it; // 输出 "hello"
}
2. 长度与容量
std::string 区分 长度(实际字符数) 和 容量(已分配的内存可容纳的最大字符数,不含终止符

