目录

  • 前言
  • 1. 下标+[]
    • 1.1 代码实现
    • 1.2 细节解析
    • 1.3 题目应用
  • 2. 迭代器
    • 2.1 begin+end 正向迭代器
      • 2.1.1 代码实现
      • 2.1.2 细节解析
    • 2.2 反向迭代器
      • 2.2.1 代码实现
      • 2.2.2 细节解析
    • 2.3 可读可写
  • 3. 范围for
    • 3.1 代码实现
    • 3.2 细节解析
  • 后记

前言

hello,大家好。这期文章我们来分享三种访问和遍历string类对象的方法,闲言少叙,让我们开始啦。

1. 下标+[]

1.1 代码实现

#include<iostream>
#include<string>
using namespace std;
int main()
{string s1 = "hello,world";for (size_t i = 0; i < s1.size(); ++i){cout << s1[i];}return 0;
}

1.2 细节解析

这种方法其实就像访问数组一样去访问string类的对象。不过我们要注意,这种方法本质上是一种函数调用。s1【i】相当于s1.operator【】(i)。这就会返回第i个位置的字符的引用。并且这种方法不仅可以遍历字符,也可以写入字符,比如像下面这样。

#include<iostream>
#include<string>
using namespace std;
int main()
{string s1 = "hello,world";for (size_t i = 0; i < s1.size(); ++i){s1[i]='x';}cout << s1 << endl;return 0;
}


代码中的size_t,也许你好奇它是什么。我们来看一下

size_t是基本无符号整数类型之一的别名。它是一种能够以字节表示任何对象大小的类型:size_t是sizeof操作符返回的类型,在标准库中广泛用于表示大小和计数。

也就是说size_t就相当于unsigned int类型。size_t i=0,就是定义了一个无符号整形的i,i=0。
而s1.size()中的size()则是返回字符串长度的函数,所以i<s1.size()就是i<字符串的长度的值。
解释到这里,我们就更清晰的理解这种方法和访问数组的类似之处了。

1.3 题目应用

题目的链接在这里
找出字符串中第一个只出现一次的字符

对于这个题目,首先我们要知道每一个字符出现的次数,于是我们要设计一个计数器,然后我们只要找到第一个出现一次的字符就好了。来看代码

class Solution
{public:int firstUniqChar(string s) {int count[26]={0};for (size_t i = 0; i < s.size(); ++i){count[s[i]-'a']++;}for (size_t i = 0; i < s.size(); ++i){if(count[s[i]-'a']==1)return i;}return -1;}
};

在这段代码中,我们利用了两次下标遍历。就完美地实现了这个题目,注意count[s[i]-‘a’],我们要这样写的原因是ASCII值,s[i]是一个字母,可以默认为小写,小写字母减去a的ASCII码,就是会得到它在0到26之间的位置。这个位置对应的数字是0.只要出现这个位置一次,就代表这个位置对应的字母出现一次。

2. 迭代器

什么是迭代器呢?我们在后续的文章中会进行详细的介绍,在这里我们只需要简单了解一下迭代器就好

迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

我们在这里呢,就只需要记住用迭代器遍历string类对象的写法就可以了。我们可以把迭代器想象为指针。

2.1 begin+end 正向迭代器

2.1.1 代码实现


#include<iostream>
#include<string>
using namespace std;
int main()
{string s1 = "hello,world";string::iterator it = s1.begin();while (it != s1.end()){cout << *it;++it;}return 0;
}

2.1.2 细节解析

begin是返回字符串第一个字符的迭代器,而end则是返回一个指向字符串后一个字符的迭代器。注意,end返回的是指向字符的下一个字符的迭代器。C++中的迭代器一般是左闭右开区间。

2.2 反向迭代器

2.2.1 代码实现


#include<iostream>
#include<string>
using namespace std;
int main()
{string s1 = "hello,world";string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){cout << *rit;++rit;}return 0;
}

2.2.2 细节解析

我们发现,反向迭代器输出的是正向迭代器相反的结果。在反向迭代器中,rbegin指向字符串的最后一个字符(即字符串的反向开头)。rend返回一个反向迭代器,指向字符串第一个字符(被认为是字符串的反向端)前面的理论元素。正向迭代器与反向迭代器的不同还在于,正向迭代器的++是向尾部走的,而反向迭代器则向头部走。

2.3 可读可写

无论是正向迭代器还是反向迭代器也都是可以写入字符的,我们以正向迭代器为例。

#include<iostream>
#include<string>
using namespace std;
int main()
{string s1 = "hello,world";string::iterator it = s1.begin();while (it != s1.end()){*it='a';cout << *it;++it;}return 0;
}

3. 范围for

3.1 代码实现

#include<iostream>
#include<string>
using namespace std;
int main()
{string s1 = "hello,world";for (auto e : s1){cout << e;}return 0;
}

3.2 细节解析

范围for是C++11的作品。它在底层是根据迭代器来实现的。它会依次取容器中的数据,赋值给e,会自动判断结束。但是注意,范围for是不支持写入的,因为我们是从容器里取出来,就相当于从箱子里拿出一个个小球放到我们眼前,这个过程中是无法改变小球的大小和颜色的。

后记

好的,我们这期文章就分享到这里了。希望对大家有所帮助。老规矩,这个系列的文章最后都是要分享一首诗的,今天我们的分享是《Shut Out That Moon》如下:

Close up the casement, draw the blind, Shut out that stealing moon, She wears too much the guise she wore Before our lutes were strewn With years-deep dust, and names we read On a white stone were hewn. Step not forth on the dew-dashed lawn To view the Lady's Chair, Immense Orion's glittering form, The Less and Greater Bear: Stay in; to such sights we were drawn When faded ones were fair. Brush not the bough for midnight scents That come forth lingeringly, And wake the same sweet sentiments They breathed to you and me When living seemed a laugh, and love All it was said to be. Within the common lamp-lit room Prison my eyes and thought; Let dingy details crudely loom, Mechanic speech be wrought: Too fragrant was Life's early bloom, Too tart the fruit it brought!by Thomas Hardy

C++之string类(2):三种访问遍历string类对象的方式相关推荐

  1. java 类中有几种访问权限_类中成员的访问权限_Java语言程

    类中成员的访问权限_Java语言程 4.7.2 类中成员的访问权限 Java将类中成员(成员变量和成员方法)的访问权限(可见性)划分为4种情况,按照访问权限的范围大小从小到大列出如下. ·私有(pri ...

  2. java .class 实例对象_Java产生Class类的三种实例化对象的方法

    Java产生Class类的三种实例化对象的方法 1.object.getClass 2.类名.class直接根据某个具体的类来取得Class实例化对象 3.Class.forName(String c ...

  3. C++的三种访问权限的继承

    C++的三种访问权限的继承 开发工具与关键技术:C++.VisualStudio 作者:何任贤 撰写时间:2019年05月20日 三种访问权限继承指的是,继承过来的成员函数和成员变量还有析构函数的访问 ...

  4. Hibernate——(3)主键生成策略持久化类的三种状态

    一 持久化类 1.持久化:内存对象--->数据库(硬盘)Hibernate持久化的框架 持久化类:Java对象与数据库中的表建立映射关系            Hibernate就称为持久化类( ...

  5. FTP服务器构建与维护,ftp服务器的搭建与三种访问途径

    FTP服务器的搭建与三种访问途径 FTP服务介绍 FTP服务(File Transfer Protocol,文件传输协议)是典型的C/S结构 的应用层协议,需要由服务端软件,客户端软件两部分共同实 现 ...

  6. 反射:获取Class类的三种方法

    反射:获取Class类的三种方法 // 1.Class类中的一个静态方法:forName(全限名:包名 + 类名) Class c = Class.forName(路径); System.out.pr ...

  7. java 载入类的三种方法

    载入类的几种方法 所有资源都通过ClassLoader载入到JVM里,那么在载入资源时当然可以使用ClassLoader,只是对于不同的资源还可以使用一些别的方式载入,例如对于类可以直接new,对于文 ...

  8. 在.NET Core中三种实现“可插拔”AOP编程方式(附源码)

    一看标题肯定会联想到使用动态编织的方式实现AOP编程,不过这不是作者本文讨论的重点. 本文讨论另外三种在netcore中可实现的方式,Filter(过滤器,严格意义上它算是AOP方式),Dynamic ...

  9. Python二叉树的三种深度优先遍历

    Python二叉树的三种深度优先遍历 一.广度优先遍历和深度优先遍历 对二叉树进行遍历(traversal)是指依次对树中每个节点进行访问,在遍历的过程中实现需要的业务. 对树的遍历方式有广度优先遍历 ...

最新文章

  1. keras网络变为pytorch网络的一些参考
  2. laravel 5.5 整合 jwt 报错Method Tymon\JWTAuth\Commands\JWTGenerateCommand::handle() does not exist解决...
  3. [BetterExplained]书写是为了更好的思考
  4. 【HNOI2019】部分题简要题解
  5. Oracle Quality --- Setup Collection Element and Collection Plan
  6. Oracle索引或这类索引的分区处于不可用状态 查询
  7. jstat命令(Java Virtual Machine Statistics Monitoring Tool
  8. WPF自定义控件与样式(4)-CheckBox/RadioButton自定义样式
  9. js 操作java对象_js对象复制
  10. android listview 增加单选 复选,ListView里面加入CheckBox如何实现单选?
  11. 全局loading如何控制
  12. java 解析excle
  13. PHP推流地址获取图片
  14. Linux上修改open files数目
  15. 忘记密码怎么卸载和删除网维大师~
  16. Android App 启动时显示正在加载图片(源码)
  17. 实现原理 扫描枪_条码扫描枪的工作原理
  18. 12123 上传照片到文件服务器失败,“交管12123”APP上传证件照片老是出错?教你正确上传姿势……...
  19. 使用命令行查看Windows系统激活信息
  20. python实例013--定义一个矩形类

热门文章

  1. 陈欧再为自己代言 聚美优品超跌反弹涨7.96%
  2. 《深入理解Java虚拟机:JVM高级特性与最佳实践》书评
  3. more effective c++和effective c++读书笔记
  4. 阿里巴巴 笔试题第一题 请播放周杰伦的七里香给我听
  5. wow服务器硬件,《魔兽世界》硬件全面升级4月26日开始
  6. 【数据科学】如何试图说服数据?
  7. 类变量和实例变量的区别
  8. android 字体荧光效果,Android实现锁屏荧光效果
  9. 梅森公式确定系统的传递函数
  10. html5本地缓存LocalStorage