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

相关推荐
TEC_INO1 分钟前
STM32_11:DMA
java·前端·stm32
韩曙亮2 分钟前
【Web APIs】浏览器本地存储 ② ( window.sessionStorage 本地存储常用 API 简介 | 代码示例 )
开发语言·前端·javascript·localstorage·sessionstorage·web apis·浏览器本地存储
郑州光合科技余经理2 分钟前
私有化B2B订货系统实战:核心模块设计与代码实现
java·大数据·开发语言·后端·架构·前端框架·php
澄澈青空~4 分钟前
接续:DKOM 进程隐藏的原理
c++·安全
五阿哥永琪4 分钟前
基于 Spring AOP 的角色权限校验实现指南&&注解类型避坑指南
java·后端·spring
chillxiaohan5 分钟前
GO学习踩坑记录
开发语言·学习·golang
czlczl2002092510 分钟前
Quartz基本原理与工程实践
java·spring boot·后端
callJJ13 分钟前
Builder模式详解:从困惑到理解
java·建造者模式·智谱
2301_7644413313 分钟前
python实现罗斯勒吸引子(Rössler Attractor)
开发语言·数据结构·python·算法·信息可视化
大猫和小黄14 分钟前
若依从零到部署:前后端分离和微服务版
java·微服务·云原生·架构·前后端分离·若依