【C++】STL容器-string的遍历

news2024/11/19 23:36:48


1.引言

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

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

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

2.string容器的基本特性

2.1string的定义与初始化

常用的实例化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 << *it << endl;
	++it;
}
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; }

欢迎各位大佬一起学习交流~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2132510.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​中国版Sora:Vidu发布“主体参照”功能,支持让任意主体保持一致

OpenAI发布Sora模型后&#xff0c;掀起了AI视频生成热潮&#xff0c;一段60秒的视频不仅让ai领域的从业者兴奋不已&#xff0c;也让全世界的资本聚集在了这个领域上。 国内玩家在这个赛道也是卷了又卷。字节跳动的即梦AI&#xff0c;快手的可灵AI&#xff0c;智谱AI的CogVideoX…

Kotlin 中的 `flatMap` 方法详解

在 Kotlin 中&#xff0c;flatMap 是一个非常强大的集合操作函数&#xff0c;它结合了 map 和 flatten 的功能。flatMap 能够将一个集合中的每个元素映射为另一个集合&#xff0c;然后将这些集合连接成一个单一的集合。在很多场景下&#xff0c;它比单独使用 map 和 flatten 更…

websim.ai 体验过程+感受

体验 websim.ai 后感觉网站更倾向于客户提需求或者满足客户需求的可视化页面阶段&#xff0c;比较像设计界面。就是一直命令AI添加功能&#xff0c;然后它绘图。导出的代码是单个HTML文件&#xff0c;用前端三件套写的。 体验过程 ① Create a relationship diagram between …

四数之和--力扣18

四数之和 题目思路代码 题目 思路 类似于三数之和&#xff0c;先排序&#xff0c;利用双指针解题。 如果排序后的第一个元素大于目标值&#xff0c;直接返回&#xff0c;为什么nums[i]需要大于等于0&#xff0c;因为目标值可能为负数。比如&#xff1a;数组是[-4, -3, -2, -1…

电水壶自复位热断循环测试合规性

在家用电器安全标准中,电水壶的安全性尤为重要,尤其是涉及热保护装置的部分。电水壶在日常使用中频繁接触高温水,极端情况下,温度可能异常升高。因此,为了确保用户的安全,热保护装置必须可靠工作。本文将探讨自复位热断路器(TCO)在电水壶中的作用,以及在100次循环测试…

9.13信锐面经

1.C程序的编译过程?C头文件是怎么预处理的? 当编译器遇到#include指令时&#xff0c;它会将指定的头文件内容插入到当前源文件中。这个过程是递归的&#xff0c;即如果被包含的头文件中又有其他的#include指令&#xff0c;那么也会继续包含相应的头文件。 头文件中可能包含宏…

Nature Aging | 还在做差异分析吗?相关性+常规机器学习模型,这篇顶刊纯生信的研究思路可以说领先了一个版本!

先前给大家分享了一篇 Nature Medince 的年龄相关建模文章&#xff0c;阅读量蛮高&#xff0c;大家也都十分感兴趣。这个领域的生信研究确实会有一些特色&#xff0c;一些高分模型研究或多或少都偏向于模型的可解释性。 ▲ Nature Medicine | 常规机器学习构建蛋白质组衰老时钟…

电巢科技携Ecosmos元宇宙产品亮相第25届中国光博会

第25届中国国际光电博览会&#xff08;“CIOE中国光博会”&#xff09;今日在深圳国际会展中心盛大开幕。本届博览会以“光电引领未来&#xff0c;驱动应用创新”为主题&#xff0c;吸引了全球超过3700家优质光电企业参展&#xff0c;展示了光电产业的最新成果和前沿技术。 电…

OAExploit一款基于OA产品的一键扫描工具

OAExploit一款基于OA产品的一键扫描工具 01 项目介绍 一款扩展性高的渗透测试框架渗透测试框架 出现卡死的几种情况&#xff1a;1.点击按钮太快 2. 打印log 的异常 02 工具展示

说真心话,在IT行业,项目经理不懂「敏捷管理」真混不下去!

根据PMI官方2015年的《职业脉搏调查》报告显示&#xff0c;高度敏捷、快速做出市场反应的组织与行动迟缓的组织相比&#xff0c;项目的成功率更高。 因此&#xff0c;在快速发展的IT行业中&#xff0c;项目经理如果能够具备快速迭代、灵活应对市场需求的“敏捷管理”思维会更吃…

--- 数据结构 优先级队列 --- java

之前提高到队列是一种先进先出的结构&#xff0c;但是在某些情况下操作的数据具有优先级&#xff0c;那么对他先进行操作&#xff0c;这时队列就不能满足需求了&#xff0c;因为队列只能操作对头的元素&#xff0c;而具有优先级的数据不一定是在对头&#xff0c;这样就需要优先…

RHCE--复习(二)之时间同步服务器

一、计时方式的发展 1.1.古代计时方式 在远古时期&#xff0c;人类用来确定时间的方式是一些自然界“相对”宜古不变的周期。如地球的公转是为一年&#xff0c;月球的公转是为一月&#xff0c;地球的自转是为一天等&#xff0c;最早的计时可以追溯到公元前大约2000年&#xff…

ESP8266+eclipse+AP+最简单webserver

实现AP模式下&#xff0c;http-server功能 在ESP8266_RTOS_SDK\ESP8266_RTOS_SDK\examples\wifi\getting_started\softAP增加webserver部分代码 1. 代码 //softap_example_main.c /* WiFi softAP ExampleThis example code is in the Public Domain (or CC0 licensed, at y…

LLaMA-Factory QuickStart

转自&#xff1a;知乎 1. 项目背景 开源大模型如LLaMA&#xff0c;Qwen&#xff0c;Baichuan等主要都是使用通用数据进行训练而来&#xff0c;其对于不同下游的使用场景和垂直领域的效果有待进一步提升&#xff0c;衍生出了微调训练相关的需求&#xff0c;包含预训练&#xf…

R1234yf汽车空调制冷剂简介

R1234yf汽车空调制冷剂是一种具有优异性能的环保型制冷剂,它被设计用于替代传统的R134a制冷剂。以下是关于R1234yf汽车空调制冷剂的详细介绍: 一、基本属性 化学名称:2,3,3,3-四氟丙烯 简称:R1234yf或HFO-1234yf 性质:无色HFO制冷剂气体 二、环保特性

2024网络安全人才实战能力白皮书安全测试评估篇

9月10日&#xff0c;国内首个聚焦“安全测试评估”的白皮书——《网络安全人才实战能力白皮书-安全测试评估篇》&#xff08;以下简称“白皮书”&#xff09;在国家网络安全宣传周正式发布。 作为《网络安全人才实战能力白皮书》的第三篇章&#xff0c;本次白皮书聚焦“安全测…

【原创】java+swing+mysql项目管理系统设计与实现

个人主页&#xff1a;程序员杨工 个人简介&#xff1a;从事软件开发多年&#xff0c;前后端均有涉猎&#xff0c;具有丰富的开发经验 博客内容&#xff1a;全栈开发&#xff0c;分享Java、Python、Php、小程序、前后端、数据库经验和实战 文末有本人名片&#xff0c;希望和大家…

小程序开发设计-第一个小程序:安装开发者工具③

第一个小程序&#xff1a;安装开发者工具 1.了解微信开发者工具&#xff1a; 微信开发者工具是官方推荐使用的小程序开发工具&#xff0c;它提供的主要功能如下&#xff1a; ①.快速创建小程序项目 ②.代码的查看和编辑 ③.对小程序功能进行测试 ④.小程序的预览和发布 2.下载…

swiftUI结构体数组修改属性UI没更新

SwiftUI使用了值语义&#xff0c;即当数组的值发生更改时&#xff0c;SwiftUI无法检测到具体的更改操作。 要解决这个问题&#xff0c;可以使用SwiftUI中的State属性包装器来创建一个可观察的状态变量。当数组发生更改时&#xff0c;通过更改状态变量的值来触发列表的更新,但是…

ASCII、Unicode、UCS-2、UTF-8互转编码原理

基础 ASCII (American Standard Code for Information Interchange),1967年 GB2312 是中华人民共和国国家汉字信息交换用编码,国家标准总局发布&#xff0c;1981年5月1日实施,对应的国标标准号&#xff1a;GB/T 2312-1980 Unicode 1990年开始研发&#xff0c;1994年发布初版…