[c++]string的三种遍历方式

目录

[一、下标+ ](#一、下标+[ ])

二、迭代器

三、范围for

一、下标+

方式一:下标+ 方式

**string类的[]运算符重载提供了类似数组的访问接口,**但背后是完整的面向对象封装,兼具易用性和安全性。

复制代码
//下标+[]->可读可写
void test01()
{
	//下标+[]->可读可写
	string s1("hello world");

	//遍历string字符串
	for (int i = 0; i < s1.size(); i++)
	{
		cout << s1[i] << " ";
	}
	cout << endl;

	//修改string字符串
	for (int i = 0; i < s1.size(); i++)
	{
		s1[i]++;
		cout << s1[i] << " ";
	}
	cout << endl;

	//需要注意的是区分的s1[1]和s2[1]是不一样的
	//s1[1]底层调用的是 char& operator[](size_t pos)
	//s2[1]中s2是数组名,代表首元素地址 实际是*(s2+1) 
	char s2[] = "hello world";
	s1[1];
	s2[1];
}

二、迭代器

方式二:迭代器,迭代器是类似于指针一样的抽象数据类型,它提供了统一的容器访问接口。对于不同的容器,迭代器的具体实现可能不同(可能是指针,也可能是类对象)。begin() 返回指向容器第一个元素的迭代器,end() 返回指向容器最后一个元素之后位置的迭代器,迭代器范围是左闭右开区间 [begin, end)

复制代码
void test02()
{
	//迭代器->可读可写
	string s1("hello world");

	//遍历string字符串
	string::iterator it1 = s1.begin();
	while (it1 != s1.end())
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;

	//修改string字符串
	string::iterator it2 = s1.begin();
	while (it2 != s1.end())
	{
		(*it2)++;
		cout << *it2 << " ";
		it2++;//////////////
	}
	cout << endl;

	//输出结果
	//h e l l o   w o r l d
	//i f m m p ! x p s m e
}

三、范围for

方式三:范围for循环底层基于迭代器实现,自动完成迭代和结束判断。参数类型的选择应根据需求决定:只需读取且对象较小时使用传值,需要修改元素或避免大对象的拷贝开销时使用引用,确保元素不被修改时使用const引用。

  • auto(传值):创建临时对象,原元素不受影响,适合内置类型和小对象

  • auto&(引用):可修改原元素,避免大对象的拷贝开销

  • const auto&(常量引用):只读访问,避免拷贝,保证原数据不变"

    void test03()
    {
    //范围for
    string s1("hello world");

    复制代码
      //遍历string字符串
      //s1会取出数据赋值给ch,但是没法修改ch,需要加引用才可以修改
      for (auto ch : s1)
      {
      	cout << ch << " ";
      }
      cout << endl;
    
    
      //修改string字符串,注意这段代码不会打印i f m m p ! x p s m e
      //原因是后置++,先输出第一个字符h,再将h->i,输出字符e,再将e->f......
      //for (auto& ch : s1)
      //{
      //	cout << (ch++) << " ";
      //}
      //cout << endl;
    
      //正确输出+修改
      for (auto& ch : s1)
      {
      	ch++;//先对字符++
      	cout << ch << " ";
      }
      cout << endl;
    
      //输出结果
      //h e l l o   w o r l d
      //i f m m p ! x p s m e

    }

相关推荐
codeejun1 小时前
每日一Go-73、云原生成本优化 —— 资源限制 & 指标驱动扩容
开发语言·云原生·golang
888CC++1 小时前
如何在 C 语言中进行程序调试?
前端·javascript·算法
就叫_这个吧1 小时前
Java注解、元注解、自定义注解定义及应用
java·开发语言·注解
Sam_Deep_Thinking2 小时前
聊聊Java中的of
java·开发语言·架构
(●—●)橘子……2 小时前
力扣第503场周赛练习理解
python·学习·算法·leetcode·职场和发展·周赛
明志数科4 小时前
4D时序标注技术详解:让机器人理解连续动作的数据基础
java·算法·机器人
feng_you_ying_li4 小时前
C++复习二,继承与多态
c++
小小de风呀4 小时前
de风——【从零开始学C++】(十一):list的基本使用和模拟实现
开发语言·c++·list
KaMeidebaby5 小时前
卡梅德生物技术快报|原核表达系统工艺优化:包涵体重折叠 + 分子筛纯化实现功能 RBD 高效制备,附全参数配置
前端·人工智能·算法·数据挖掘·数据分析