2.22 STL 中string的学习

1.什么是STL

STL standard template libarary 标准模板库:是C++标准库的重要组成部分 不仅是一个可复用的组件库 而且是一个包罗数据结构和算法的软件框架

2.STL六大组件

容器 算法 迭代器 仿函数 适配器 分配器

3.STL三大境界

学习 熟练 扩展

string的学习

通俗理解

string就是一个会自己长大的字符数组 自带了很多工具函数

为什么使用string

自动内存管理 方便操作 安全(不会越界) 与C兼容

C++ string 类常用接口说明

1. 简介

string 是 C++ 标准库中的字符串类,封装了动态字符数组,自动管理内存,提供丰富的成员函数。使用 string 比 C 风格字符串更安全、方便。

2. 头文件与命名空间

#include<string>usingnamespace std;// 或 std::string

3. 常用接口分类

3.1 构造与赋值

接口说明示例
string()默认构造空字符串string s;
string(const char* s)用 C 字符串构造string s("hello");
string(size_t n, char c)构造 n 个字符 cstring s(5, 'a'); → “aaaaa”
string(const string& str)拷贝构造string s2(s1);
string(const string& str, size_t pos, size_t len = npos)子串构造string s(s1, 2, 3);
operator=赋值s = "new";s = s2;
assign()多种赋值方式s.assign(5, 'x'); → “xxxxx”

3.2 容量操作

接口说明示例
size() / length()返回字符个数int n = s.size();
capacity()返回当前分配的内存容量size_t cap = s.capacity();
empty()判断是否为空if (s.empty())
resize(size_t n)改变大小(截断或填充默认字符)s.resize(10);
resize(size_t n, char c)改变大小并用 c 填充新位置s.resize(10, '!');
reserve(size_t n = 0)预分配至少 n 个字符的空间s.reserve(100);
clear()清空字符串s.clear();

3.3 元素访问

接口说明示例
operator[](size_t pos)下标访问(不检查越界)char ch = s[2];
at(size_t pos)带越界检查的访问(越界抛异常)char ch = s.at(2);
front()返回第一个字符char f = s.front();
back()返回最后一个字符char b = s.back();

3.4 修改操作

接口说明示例
operator+=尾部追加s += " world";s += '!';
append()追加多种形式s.append("xxx");s.append(3, '!');
push_back(char c)尾部添加一个字符s.push_back('?');
insert(size_t pos, const string& str)在 pos 前插入s.insert(5, "xx");
erase(size_t pos = 0, size_t len = npos)删除从 pos 开始的 len 个字符s.erase(5, 3);s.erase(); 清空
replace(size_t pos, size_t len, const string& str)替换子串s.replace(2, 3, "abc");
swap(string& other)交换两个字符串s1.swap(s2);

3.5 查找操作

所有查找函数返回 size_t,未找到返回 string::npos

接口说明示例
find(const string& str, size_t pos = 0)从 pos 开始正向查找子串size_t p = s.find("lo");
find(char c, size_t pos = 0)从 pos 开始查找字符p = s.find('o', 5);
rfind()反向查找p = s.rfind("lo");
find_first_of(const string& str, size_t pos = 0)查找 str 中任意字符首次出现的位置p = s.find_first_of("aeiou");
find_last_of()查找最后一个出现的位置p = s.find_last_of("aeiou");
find_first_not_of()查找第一个不属于 str 的字符p = s.find_first_not_of("abc");
find_last_not_of()查找最后一个不属于 str 的字符

3.6 子串与比较

接口说明示例
substr(size_t pos = 0, size_t len = npos)提取子串string sub = s.substr(2, 3);
compare(const string& str)比较(返回 0 相等,<0 小于,>0 大于)int res = s1.compare(s2);
compare(size_t pos, size_t len, const string& str)比较子串s1.compare(2, 3, s2);
关系运算符==!=<><=>=if (s1 == s2)

3.7 迭代器支持

接口说明示例
begin() / end()返回正向迭代器for (auto it = s.begin(); it != s.end(); ++it)
rbegin() / rend()返回反向迭代器逆向遍历
范围 for基于范围的循环for (char c : s)

3.8 与 C 风格字符串转换

接口说明示例
c_str()返回 const char* 指针(以 ‘\0’ 结尾)printf("%s", s.c_str());
data()C++11 起同 c_str()const char* p = s.data();
const char* 构造隐式转换(若构造函数非 explicit)string s = "hello";

4. 注意事项

  • string::nposfind 等函数未找到时返回,值为 -1(实际是 size_t 最大值)。
  • 越界访问operator[] 不检查越界,at() 会检查并抛异常。
  • 迭代器失效:插入、删除、重新分配可能导致迭代器失效。
  • c_str() 结果有效性:在 string 被修改或销毁后,返回的指针可能失效。
  • 内存管理string 通常有小字符串优化(SSO),短字符串不分配堆内存。

5. 综合示例

#include<iostream>#include<string>usingnamespace std;intmain(){ string s ="C++ string"; s.append(" is powerful");// 查找并替换 size_t pos = s.find("powerful");if(pos != string::npos){ s.replace(pos,8,"awesome");}// 遍历for(char c : s){ cout << c;} cout << endl;// 转 C 字符串输出printf("C-string: %s\n", s.c_str());// 子串 string sub = s.substr(4,6);// "string" cout <<"substr: "<< sub << endl;return0;}

以上是 string 最常用的接口,掌握这些足以应对大多数日常编程需求。

resize(size_t n)

改变大小(截断或者填充默认字符)

resize(size_t n,char c)

用指定字符填充扩展的区域或者截断

reserve(size_t n = 0)

预分配至少n个字符的空间
###clear()清空字符串

iterator的使用

iterator是一个迭代器 可以在不同的容器中进行移动 为所有的容器和算法提供一个接口 是通用的
借助begin函数(返回容器的第一个元素地址)和end函数(容器最后一个元素地址的下一个地址)我们可以进行遍历
代码实现

list<int> lt ={1,2,3,4,5}; list<int>::iterator lit = lt.begin();while(lit != lt.end()){ std::cout <<*lit << std::endl;++lit;}

auto(范围for)遍历

auto看上去高级 实际上也是iterator 只是自动调用了 写起来比较简单
代码如下:

list<int> l2 ={1,2,3,4,5};for(auto ch : l2){ std::cout << ch <<" ";} std::cout << std::endl;

嗯 严格意义上来说一行就能遍历加上打印
如果想要改变容器里面的值 需要加上引用 不加引用实际上是传值调用 不会影响容器里面的值

auto关键字

编译器自动查找替换 不能单独定义 必须要编译器推导
当类型名过长的时候可以简化代码 但是会降低可读性
比如:

std::map<std::string,std::string>::iterator it = dict.begin();

这一大坨就可以被替换为

auto it = dict.begin();

auto不能定义数组 不能做参数 但是可以做返回值

反向迭代器 reverse_iterator

大部分都和正向迭代器iterator一样 但是要使用rbegin(指向最后一个字符)和rend(指向第一个字符的前一个位置)

list<int> lt ={1,2,3,4,5};//list<int>::reverse_iterator lit = lt.rbegin();auto lit = lt.rebegin();while(lit != lt.rend()){ std::cout <<*lit << std::endl;++lit;}

这里也是反向移动的
反正这些东西发明出来就是为了方便遍历 那个代码少用哪个 谁爽用谁

list<int> lt ={1,2,3,4,5};for(auto it = v.rebegin();it != v.rend();++it){ cout <<*it <<" ";}return0;

Read more

【Linux网络系列】:JSON+HTTP,用C++手搓一个web计算器服务器!

【Linux网络系列】:JSON+HTTP,用C++手搓一个web计算器服务器!

🔥 本文专栏:Linux网络Linux实践系列 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录:别害怕选错,人生最遗憾的从不是‘选错了’,而是‘我本可以’。每一次推倒重来的勇气,都是在给灵魂贴上更坚韧的勋章。 ★★★ 本文前置知识: 序列化与反序列化 引入 在之前的博客中,我详细介绍了序列化 与反序列化 的概念。对于使用 TCP 协议进行通信的双方,由于 TCP 是面向字节流的,在发送数据之前,我们通常需要定义一种结构化的数据来描述传输内容,并以此作为数据的容器。在 C++ 中,这种结构化数据通常表现为对象或结构体。然而,我们不能直接将结构体内存中对应的字节原样发送到另一端,因为直接传递内存字节会引发字节序 和结构体内存对齐 的问题。不同平台、不同编译器所遵循的内存对齐规则可能不同,这可能导致接收方在解析结构体字段时出现错误。 因此,我们需要借助序列化 。序列化 是指将结构化的数据按照预定的规则转换为连续的字节流。其主要目的是屏蔽平台差异,使得位于不同平台的进程能够以统一的方式解析该字节流。序列化通常分为两种形式:文本序列化 与二进制序列化 。 文

By Ne0inhk
【算法一周目】位间流转,数字律动——洞察 C++ 位运算中的精妙与哲思

【算法一周目】位间流转,数字律动——洞察 C++ 位运算中的精妙与哲思

文章目录 * 常见位运算 * 1. 位1的个数 * 2. 比特位计数 * 3.汉明距离 * 4. 只出现一次的数字 * 5. 只出现一次的数字 III * 6. 只出现一次的数字 II * 7. 判定字符是否唯一 * 8. 丢失的数字 * 9. 两整数之和 * 10. 只出现一次的数字 II 常见位运算 1. 判断一个数的二进制表示的第x位是0还是1 * (n >> x) & 1 2. 将一个数的二进制表示的第x位修改成1 * n |= (1 << x) 3. 将一个数的二进制表示的第x位修改成0 * n &= ~ (1 << x) 4.

By Ne0inhk
探索实现C++ STL容器适配器:优先队列priority_queue

探索实现C++ STL容器适配器:优先队列priority_queue

前引: 在算法竞赛中,选手们常常能在0.01秒内分出胜负;在实时交易系统中,毫秒级的延迟可能意味着数百万的盈亏;在高并发服务器中,每秒需要处理数万条不同优先级的请求——这些系统背后,都隐藏着同一种强大的数据结构: 优先队列(priority_queue) 作为C++标准库中最优雅的数据结构适配器,priority_queue完美封装了堆算法的高效性,却只需几行代码即可实现复杂优先级管理。本文将深入剖析: (1) 堆原理与优先队列的机械美学 (2)定制化优先级策略的高级技巧 (3)实战性能对比与编译器级优化 (4)在万亿级数据处理中的独特优势 目录 优先队列介绍 优先队列的渊源 实例化 插入元素 访问元素 获取元素个数 判断优先队列是否为空 删除堆顶元素 · 优先队列的模拟实现 类模板 插入元素 访问元素 获取元素个数 判断优先队列是否为空 删除堆顶元素 效果展示 优先队列介绍 优先队列priority_queue 是 C++ 标准模板库(

By Ne0inhk
2026年3月GESP真题及题解(C++一级):数字替换

2026年3月GESP真题及题解(C++一级):数字替换

2026年3月GESP真题及题解(C++一级):数字替换 题目描述 Alice 不喜欢 4,喜欢 8,她想把 4 全换成 8,若无 4 则不修改。 输入格式 输入一行,一个整数 A,表示替换前的数。 输出格式 输出一行,包含一个整数 B,表示替换后的数。 样例 样例 1: 输入: 8459045 输出: 8859085 样例 2: 输入: 123 输出: 123 数据范围 * 0 ≤ A ≤ 10 9 0 \leq A \leq 1

By Ne0inhk