C++ string 详解:STL 字符串容器的使用技巧
STL 简介
STL(Standard Template Library,标准模板库)是 C++ 标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
STL 的版本历史
- HP 版本:由 Alexander Stepanov、Meng Lee 在惠普实验室完成,开源且允许任意运用、拷贝、修改。是所有 STL 实现版本的始祖。
- P.J. 版本:由 P. J. Plauger 开发,继承自 HP 版本,被 Windows Visual C++ 采用。不可公开或修改,可读性较低。
- RW 版本:由 Rouge Wage 公司开发,继承自 HP 版本,被 C++ Builder 采用。不可公开或修改,可读性一般。
- SGI 版本:由 Silicon Graphics Computer Systems, Inc 开发,继承自 HP 版本,被 GCC (Linux) 采用。可移植性好,可公开、修改甚至贩卖,命名和编程风格阅读性非常高。
String 类概述
C 语言中的字符串
C 语言中,字符串是以 '\0' 结尾的一些字符的集合。C 标准库提供了一些 str 系列的库函数,但这些库函数与字符串是分离开的,不太符合 OOP 的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
OOP 思想
OOP(Object-Oriented Programming)即面向对象编程,核心是将程序中的数据和操作数据的方法封装成对象,通过对象之间的交互来完成程序功能。string 类正是基于此设计,提供了更安全便捷的字符串处理方式。
string 常见构造方式
以下是 string 类的九种常见构造方法示例:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
using namespace std;
int main() {
// 1. 空构造函数:创建一个空字符串
string s1;
cout << "s1 (空构造): \"" << s1 << "\" (长度:" << s1.size() << ")" << endl;
// 2. 字符串常量构造:用 C 风格字符串(const char*)初始化
string s2("12345");
cout << "s2 (字符串常量构造): \"" << s2 << "\" (长度:" << s2.size() << ")" << endl;
// 3. 拷贝构造:用另一个 string 对象初始化
string s3(s2);
cout << "s3 (拷贝构造): \"" << s3 << "\" (长度:" << s3.size() << ")" << endl;
// 4. 子串构造:从另一个 string 的指定位置开始,取 n 个字符
string s4(s2, 1, 3); // 从 s2 的下标 1 开始,取 3 个字符:"234"
cout << "s4 (子串构造 - 指定 count): \"" << s4 << "\" (长度:" << s4.size() << ")" << endl;
// 子串构造补充:省略 count,读取从 pos 到字符串末尾
string s4_extend(s2, 1); // 从下标 1 开始取到末尾:"2345"
cout << "s4_extend (子串构造 - 省略 count): \"" << s4_extend << "\" (长度:" << s4_extend.size() << ")" << endl;
// 5. C 风格字符串截取构造:取 C 风格字符串的前 n 个字符
string s5("hello world", 5); // 取前 5 个字符:"hello"
cout << "s5 (C 字符串截取 - 指定 n): \"" << s5 << "\" (长度:" << s5.size() << ")" << endl;
// C 风格字符串截取补充:省略 n,读取整个字符串(直到'\0')
string s5_extend("hello world"); // 等价于不指定 n,直接读全部:"hello world"
cout << "s5_extend (C 字符串截取 - 省略 n): \"" << s5_extend << "\" (长度:" << s5_extend.size() << ")" << endl;
// 6. 重复字符构造:创建包含 n 个指定字符的字符串
string s6(5, 'a'); // 5 个'a':"aaaaa"
cout << "s6 (重复字符构造): \"" << s6 << "\" (长度:" << s6.size() << ")" << endl;
// 7. 迭代器范围构造:用迭代器指定的范围初始化
string s7(s2.begin(), s2.end() - 2); // 取 s2 的 begin 到 end-2:"123"
cout << "s7 (迭代器范围构造): \"" << s7 << "\" (长度:" << s7.size() << ")" << endl;
// 8. 移动构造(C++11 及以上):将临时 string 对象的资源转移
string s8(move(string("temp string"))); // 移动构造,接管临时对象资源
cout << "s8 (移动构造): \"" << s8 << "\" (长度:" << s8.size() << ")" << endl;
// 9. 初始化列表构造(C++11 及以上):用字符初始化列表创建字符串
string s9{'h', 'e', 'l', 'l', 'o'}; // "hello"
cout << "s9 (初始化列表构造): \"" << s9 << "\" (长度:" << s9.size() << ")" << endl;
return 0;
}
以上展示了 string 的基本构造写法。掌握这些构造方式有助于在实际项目中安全、高效地处理文本数据,避免手动管理内存带来的风险。

