前言:如果你写 C++ 时还在用char*手动管理字符串,或者对 STL 的string只停留在 "会用+=拼接" 的阶段 ------ 那这篇文章大概率能帮你省不少事。
作为 STL 里最常用的容器之一,string藏着不少 "好用但容易被忽略" 的技巧:比如不用循环就能分割字符串、避免内存拷贝的高效操作、甚至能直接替代部分str系列函数。今天咱们从基础用法到实用技巧,把string的核心玩法一次性讲透,看完就能直接用到项目里~
STL简介
首先,我先简单介绍一下STL
STL(standard template libaray-标准模板库): 是C++标准库的重要组成部分 ,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。
STL的版本
原始版本
Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本--所有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)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。
STL的六大组件
我们先了解一下以后再深耕

网上有句话说:"不懂STL,不要说你会C++"。STL是C++中的优秀作品,有了它的陪伴,许多底层
的数据结构以及算法都不需要自己重新造轮子,站在前人的肩膀上,健步如飞的快速开发。由此可见STL是很重要的
String类
C语言中的字符串
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
OOP:
OOP 是面向对象编程(Object-Oriented Programming)的缩写,它是一种编程思想和方法论,核心是将程序中的数据和操作数据的方法封装成对象,通过对象之间的交互来完成程序功能。
这里我先写一个基本用法也就是string的构造;
string构造
cpp
#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的基本构造写法,预知后事如何,且听下回分解。