C++ string 详解:STL 字符串容器的使用技巧

前言:如果你写 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的基本构造写法,预知后事如何,且听下回分解。

相关推荐
机器视觉知识推荐、就业指导几秒前
用惯了QTimer定时器,如何快速在纯 C++ 项目中替换?
c++
消失的旧时光-19437 分钟前
从拷贝到移动:C++ 移动构造与移动赋值是怎么被逼出来的?(附完整示例)
开发语言·c++
古译汉书7 分钟前
部分.exe文件打开但是一直显示界面,点击任务栏持续无反应
开发语言·单片机·嵌入式硬件
码农阿豪11 分钟前
Oracle 到金仓数据库迁移实战:一次真正“落地”的国产替代之旅
java·数据库·oracle
2301_8174973312 分钟前
C++中的装饰器模式高级应用
开发语言·c++·算法
m0_5494166615 分钟前
C++编译期字符串处理
开发语言·c++·算法
m0_5811241915 分钟前
C++中的适配器模式实战
开发语言·c++·算法
Coding茶水间22 分钟前
基于深度学习的狗品种检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)
开发语言·人工智能·深度学习·yolo·目标检测·机器学习
£漫步 云端彡30 分钟前
Golang学习历程【第十篇 方法(method)与接收者】
开发语言·学习·golang
小王不爱笑13231 分钟前
SpringBoot 整合 Ollama + 本地 DeepSeek 模型
java·spring boot·后端