跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ STL 容器 string 的遍历方法

C++ STL string 容器的五种遍历方法:下标访问、at 成员函数、迭代器、范围 for 循环及 std::for_each 算法。详细对比了各方法的语法特点、性能差异及适用场景,重点说明了迭代器权限区别及边界检查机制,帮助开发者根据实际需求选择合适的字符串遍历方案。

Stephaine Walsh发布于 2026/3/29更新于 2026/9/1096 浏览
C++ STL 容器 string 的遍历方法

1. 引言

C++ STL(Standard Template Library)作为 C++ 标准库的核心部分,其重要性不言而喻。它提供了一系列高效、灵活且可复用的数据结构和算法,极大地提升了开发效率,并使得代码更加易于阅读和维护。

在 STL 中,string 容器是一个至关重要的组成部分,它专为处理字符串而设计,提供了丰富的字符串操作功能。

遍历 string 容器是处理字符串时的基本需求,它允许我们逐一访问和操作字符串中的每个字符,支持复杂的字符串分析任务,并可通过选择合适的遍历方法来优化程序性能。

2. string 容器的基本特性

2.1 string 的定义与初始化

常用的实例化 string 对象方式

//默认构造
string s1;
//带参构造
string s2("hello world");
//隐式类型转换
string s3 = "hello world";
//拷贝构造
string s4 = s1; //与 string s4(s1);等价

3. 遍历 string 容器的常用方法

3.1 使用下标访问遍历

(1)代码示例:

//下标 + []
for (int i = 0; i < s1.size(); i++) {
    cout << s1[i] << " ";
}
cout << endl;

(2)补充:size() 函数是计算字符串长度的成员函数。

(3)使用下标遍历实际是调用了运算符重载函数 operator[]。

3.2 使用 std::string 的成员函数 at 遍历

和下标遍历的方式相似,但它允许通过索引访问字符串中的字符,同时提供边界检查。如果试图访问一个超出字符串范围的索引,at 函数会抛出一个 std::out_of_range 异常。

(1)函数原型

(2)代码示例:

// at 函数遍历
for (int i = 0; i < s1.size(); i++) {
    cout << s1.at(i) << " ";
}
cout << endl;

3.3 使用迭代器遍历

在 C++ 中,迭代器是一种用于遍历容器(如 std::string)的对象。迭代器提供了对容器元素的访问,并且可以用于读取或修改容器中的元素。使用迭代器遍历 std::string 时,你可以通过迭代器访问字符串中的每个字符。

(1)代码示例

//迭代器
string::iterator it = s1.begin();
while (it != s1.end()) {
    cout << *it << " ";
    ++it;
}
cout << endl;

string::const_iterator it1 = s2.begin();
while (it1 != s2.end()) {
    cout << *it1 << endl;
    ++it1;
}
cout << endl;

在示例中声明了一个 string::iterator 类型的迭代器 it 和一个 string::const_iterator 类型 it1(区别稍后细说)。在这里可简单将 it 和 it1 看做指针,并将 it 初始化为 s1.begin(),使用循环遍历字符串,直到 it != s1.end()。

s1.begin() 指向字符串的初始位置(第一个字符的位置),s1.end() 指向字符串最后一个位置的下一个位置。

(2)函数原型

(3)位置示意图

(4)string::iterator 和 string::const_iterator 的区别

主要体现在对字符串元素的修改权限上:

  • string::iterator:允许通过迭代器修改字符串中的元素。
  • string::const_iterator:不允许通过迭代器修改字符串中的元素,只能用于访问。

类比指针可以帮助理解。

3.4 使用范围基于的 for 循环遍历(C++11 及之后版本)

底层实际使用的是迭代器。

//范围 for
for (auto& ch : s1) //自动取 s1 里面的字符自动++
{
    cout << ch << " ";
}

3.5 使用 std::for_each 算法遍历

用 std::for_each 算法遍历 std::string 时,可以传递一个 lambda 表达式或者函数对象作为操作,该函数将对字符串中的每个字符执行操作。std::for_each 算法接受两个迭代器参数,分别指向要遍历的范围的开始和结束(左闭右开),以及一个函数参数,该函数将对范围内的每个元素执行。

(1)函数原型

template<class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function f);

这里,first 和 last 是定义要遍历范围的迭代器,f 是对每个元素执行的函数。

(2)下面是一个使用 std::for_each 算法遍历 std::string 的示例代码:

#include <iostream>
#include <string>
#include <algorithm>

int main() {
    std::string str = "Hello, World!";
    // 使用 std::for_each 遍历字符串
    std::for_each(str.begin(), str.end(), [](char c) {
        std::cout << c << ' ';
    });
    std::cout << std::endl;
    return 0;
}

在这个示例中,std::for_each 接受三个参数:str.begin() 和 str.end() 是 std::string 的迭代器,它们定义了要遍历的范围;第三个参数是一个 lambda 表达式,它接受一个 char 类型的参数并打印它。这个 lambda 表达式将对字符串中的每个字符执行。

(3)补充:

lambda 表达式是一种匿名函数,它允许快速定义单行的小函数,通常用于需要函数对象的地方。

lambda 表达式的语法结构在 C++ 中相对简单明了。它通常遵循以下格式:

[capture](parameters) -> return_type {
    // 函数体
}

然而,并非所有部分都是必需的。在很多常见情况下,lambda 表达式可以被大幅简化。例如,当不需要捕获任何外部变量,且函数体较为简短时,可以省略捕获列表和返回类型,甚至参数列表也可以省略(这种情况下,lambda 表达式将没有参数)。

一个最基本的 lambda 表达式,不接受参数且不执行任何操作,可以是这样: []( ) { };

若需要向 lambda 表达式传递参数,并希望其返回特定类型的值,可以如此定义:

[](int x, int y) -> int {
    return x + y;
};

在 C++11 及之后的版本中,如果 lambda 表达式的函数体仅包含一个 return 语句,且此语句用于返回某个表达式的值,那么可以进一步简化,省略 return 关键字及花括号:

[](int x, int y) -> int { return x + y; }
// 可简化为
[](int x, int y) -> int { x + y }
// 在 C++11 及以后版本中,甚至可以进一步简化为
[](int x, int y) { return x + y; }
// 或
[](int x, int y) { x + y }

最后,如果 lambda 表达式的返回类型可以被编译器明确推断出来,那么返回类型也可以省略: [](int x, int y) { return x + y; }

目录

  1. 1. 引言
  2. 2. string 容器的基本特性
  3. 2.1 string 的定义与初始化
  4. 3. 遍历 string 容器的常用方法
  5. 3.1 使用下标访问遍历
  6. 3.2 使用 std::string 的成员函数 at 遍历
  7. 3.3 使用迭代器遍历
  8. 3.4 使用范围基于的 for 循环遍历(C++11 及之后版本)
  9. 3.5 使用 std::for_each 算法遍历

更多推荐文章

查看全部
  • Graphite Whisper 配置:Carbon 发送间隔与归档策略 AI 建议
  • Arduino 基于 6.5 寸轮毂电机的自动跟随机器人底盘超声波方案
  • Flutter Web 开发:构建跨平台 Web 应用
  • Flutter inappwebview_cookie_manager 适配鸿蒙 HarmonyOS 实战
  • IntelliJ IDEA 中 Git 推送免输密码的配置方法
  • OpenCowork 评测:Windows 本地 AI 助手与飞书集成指南
  • 大语言模型(LLM)基础概念与原理详解
  • Git Bash 在 Windows 上的安装与基础使用指南
  • MySQL 内置函数实战:日期、字符串与数学运算详解
  • 从 0 到 1 打造 RISC-V 智能家居中控:硬件 + 固件 + 通信全链路实战
  • 在 Cursor 中使用 MCP 服务
  • AI 调参技巧:贝叶斯优化 Optuna
  • 使用 Ollama 本地部署 Llama 3.1 大模型指南
  • C++ 函数重载:规则、实现与实战案例
  • C++ 模板基础
  • AI Agent 框架选型指南:OpenClaw、LangChain、AutoGPT、CrewAI 深度对比
  • 四足机器人强化学习项目架构详解
  • 本地部署 PaddleOCR-VL 实现免费 OCR 识别
  • Vitis 使用教程:从零实现 AI 模型 FPGA 部署
  • C++ set 与 map 容器使用详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online