【C++】容器string的构造函数和迭代器

目录

1 什么是string

2 迭代器 

2.1 迭代器的使用

2.2 auto关键字以及代码可读性

3 构造函数


1 什么是string

上图是C++官网对于string的解释:string是表示字符序列的对象。

string本质是一个类,位于std的命名空间下,使用前需要包含头文件#include<string>

简单理解,string可以看做一个存放字符的顺序表(容器就是数据结构,顺序表就是一种数据结构)。

2 迭代器 

迭代器是一个对象,主要用于访问容器中的元素,类似于访问数组的指针

迭代器的实现体现了C++语言面向对象特性中的封装,避免了我们直接遍历容器中的数据。

string迭代器的定义:

string s("hello string");
string::iterator it = s.begin();//正向迭代器
string::const_iterator it2 = s.cbegin();//const正向迭代器
string::reverse_iterator it3 = s.rbegin();//反向迭代器
string::const_reverse_iterator it4 = s.crbegin();//const反向迭代器

2.1 迭代器的使用

🥝普通对象及const对象的正向遍历

普通对象:

string s("hello string");//普通对象
string::iterator it1 = s.begin();
*it1 = 'x';//可以改变
while (it1 != s.end())
{
	cout << *it1;//类似指针的解引用
	++it1;//类似++指针
}
cout << endl;

 const对象:

string::const_iterator it2 = s.cbegin();//const正向迭代器
//*it2 = 'H';//err
while (it2 != s.cend())
{
	cout << *it2;
	++it2;
}
cout << endl;

🥝普通对象及const对象的反向遍历

普通对象:

string::reverse_iterator it3 = s.rbegin();//反向迭代器
*it3 = 'G';//ok
while (it3 != s.rend())
{
	cout << *it3;
	++it3;
}
cout << endl;

const对象:

string::const_reverse_iterator it4 = s.crbegin();//const反向迭代器
//*it4 = 'G';//err
while (it4 != s.crend())
{
	cout << *it4;
	++it4;
}
cout << endl;

2.2 auto关键字以及代码可读性

迭代器的定义那么一长串,我们有auto关键字可以偷懒:

auto可以自动推断变量类型,那如果我们全写成auto,恰好又没有代码提示:

 可读性就变得非常差!所以在前期尽量不要使用auto,还是提高提高自己的代码熟练度为好!

3 构造函数

string有七种构造函数:

string()

构造空串

 

 


string(const char* s)

用常量字符串构造

 


string(const string& str)

拷贝构造 


 string (const string& str, size_t pos, size_t len = npos)

拷贝构造str的子串,从str的pos位置开始拷贝,拷贝长度为len的子串

 

len给了一个缺省参数npos,什么是npos呢?  

npos的类型是size_t,即无符号类型的整形,值为-1。-1的补码是32个1,转化为无符号数,就是整形的最大值2^32-1

问题来了,如果我们不给len的长度,或者给的len超过了常量字符串的长度,vs编译器会不会开出更大的空间呢?

答案是不会!我们可以看到:当len<=常量字符串长度时,size和len的值是一样的;当len>常量字符串长度时,size顶多到常量字符串长度的位置。

Linux系统下,g++编译器对于size的处理也是一样的,但是对于capacity的处理不像vs编译器会多开点空间。


string(const char*s,size_t n)

构造常量字符串的子串,子串的长度为n

注意这里的n,如果大于常量字符串的长度,编译器会不会开出更大的空间呢?

vs编译器:

g++:

答案是会的! 只不过多开的空间里存放的数据内容我们是不清楚的。


string (size_t n, char c);

用n个字符c构造


template <class InputIterator>
  string  (InputIterator first, InputIterator last)

范围构造:从主串的first位置到last位置构造子串

由于运用到了模板,根据模板自动识别类型生成对应的构造函数的特性,传入的参数可以是迭代器或者是指针:

①迭代器

②指针

 

注:迭代器传参的时候编译器会检查越界,用指针的时候不会,所以用指针的时候不要越界访问!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

十三.日志包设计

十三.日志包设计 一.前言 在 Go 语言项目中自己设计日志包是非常重要的&#xff0c;原因如下&#xff1a;提高代码可读性和可维护性&#xff1a;良好的日志设计可以让代码更加易读和易于维护。日志可以帮助开发人员理解代码的运行过程&#xff0c;方便调试和错误排查。支持调…

C语言二进制数(ZZULIOJ1068:二进制数)

题目描述 将一个二进制数&#xff0c;转换为对应的十进制数。 输入&#xff1a;输入一个只含有’0’和’1’的字符串&#xff0c;以回车结束&#xff0c;表示一个二进制数。该二进制数无符号位&#xff0c;长度不超过31。 输出&#xff1a;输出一个整数&#xff0c;为该二进制数…

实在智能携手中国电信翼支付,全球首款Agent智能体亮相2023数字科技生态大会

11月10日-13日&#xff0c;中国电信与广东省人民政府联合主办的“2023数字科技生态大会”在广州隆重举行。本届大会以“数字科技焕新启航”为主题&#xff0c;邀请众多生态合作伙伴全方位展示数字科技新成果&#xff0c;包括数字新消费、产业数字化、智能电子、人工智能大模型等…

阿里云服务器 手动搭建WordPress(CentOS 8)

前提条件 已创建Linux操作系统的ECS实例&#xff0c;并且手动部署LNMP环境&#xff0c;具体操作&#xff0c;请参见手动部署LNMP环境&#xff08;CentOS 8&#xff09;。本教程使用的相关资源版本如下。 实例规格&#xff1a;ecs.c6.large 操作系统&#xff1a;公共镜像CentO…

【C++初阶】内存管理 初识模板

目录 一、C/C内存分布二、C/C动态内存管理方式2.1 new和delete的用法2.2 new与malloc、delete与free比较2.3 较复杂场景分析 三、operator new与operator delete函数四、 new和delete的实现原理五、初识模板5.1 泛型编程5.2 函数模板5.2.1 概念5.2.2 写法5.2.3 不同类型时使用函…

excel怎么能锁住行 和/或 列的自增长,保证粘贴公式的时候不自增长或者只有部分自增长

例如在C4单元格中输入了公式&#xff1a; 现在如果把C4拷贝到C5&#xff0c;D3会自增长为D4&#xff1a; 现在如果想拷贝的时候不自增长&#xff0c;可以先把光标放到C4单元格&#xff0c;然后按F4键&#xff0c;行和列的前面加上了$符号&#xff0c;锁定了&#xff1a; …

MySQL优化(1):B+树与索引

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 对于60%的程序员而言&a…

【智能家居】4、智能家居框架设计和代码文件工程建立

目录 一、智能家居项目框架 二、智能家居工厂模式示意 三、代码文件工程建立 SourceInsight创建新工程步骤 一、智能家居项目框架 二、智能家居工厂模式示意 三、代码文件工程建立 创建一个名为si的文件夹用于保存SourceInsight生成的文件信息&#xff0c;然后在SourceInsig…

.Net6 部署到IIS示例

基于FastEndpoints.Net6 框架部署到IIS 环境下载与安装IIS启用与配置访问网站 环境下载与安装 首先下载环境安装程序&#xff0c;如下图所示,根据系统位数选择x86或者x64进行下载安装,网址&#xff1a;Download .NET 6.0。 IIS启用与配置 启用IIS服务 打开控制面板&#xff…

学习css过渡动画-transition

文章目录 前言transition属性语法宽度改变效果透明度改变效果位置改变效果如有启发&#xff0c;可点赞收藏哟~ 前言 通常&#xff0c;当一个元素的样式属性值发生变化时&#xff0c;会立即看到页面发生变化。 css属性transition能让页面元素不是立即的、而是慢慢的从一种状态变…

【Proteus仿真】【STM32单片机】公交车报站系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器&#xff0c;使用LCD12864显示模块、DS18B20温度传感器、DS1302时钟模块、按键、LED蜂鸣器、ULN2003、28BYJ48步进电机模块等。 主要功能&#xff1a; 系统运行…

2022年6月 电子学会青少年软件编程 中小学生Python编程 等级考试一级真题答案解析(选择题)

2022年6月Python编程等级考试一级真题解析 选择题(共25题,每题2分,共50分) 1、在Python编辑器中写好程序代码后,在Run菜单中,下列哪个命令可以用来执行程序 A、Check Module B、Run Module C、Python shell D、任意一个都可以 答案:B 考点分析:考查python编辑的…

表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信你对这篇博客也感兴趣o (ˉ▽ˉ&#xff1b;) &#x1f4dc;表白墙/留言墙初级Spring Boot项目&#xff08;此篇博客的简略版&#xff0c;不带MyBatis数据库开发&#xff09; 目录 1、项目前端页面及项目…

ER 图是什么

文章目录 前言什么是 ER图ER 图实例简化的 ER 图总结 前言 产品经理在梳理产业业务逻辑的过程中&#xff0c;非常重要的一项工作就是梳理各个业务对象之间的关系。如果涉及对象很对的时候&#xff0c;没有工具支持的话很难处理清楚。今天我们就来介绍一个梳理业务对象关系的工…

前置语音群呼与语音机器人群呼哪个更好

最近通过观察自己接到的营销电话&#xff0c;通过语音机器人外呼的量应该有所下降。同时和客户交流获取到的信息&#xff0c;也是和这个情况类似&#xff0c;很多AI机器人群呼的量转向了OKCC前置语音群呼。询问原因&#xff0c;说是前置语音群呼转化更快&#xff0c;AI机器人群…

头歌 MySQL数据库 - 初识MySQL

本章内容是为了完成老师布置的作业&#xff0c;同时也是为了以后考试的时候方便复习。 数据库部分一条一条的写&#xff0c;可鼠标手动粘贴&#xff0c;除特定命令外未分大小写。 第1关&#xff1a;创建数据库 在操作数据库之前&#xff0c;需要连接它&#xff0c;输入命令&a…

《Deep learning for fine-grained image analysis: A survey》阅读笔记

论文标题 《Deep learning for fine-grained image analysis: A survey》 作者 魏秀参&#xff0c;旷世研究院 初读 摘要 细粒度图像分析&#xff08;FGIA&#xff09;的任务是分析从属类别的视觉对象。 细粒度性质引起的类间小变化和类内大变化使其成为一个具有挑战性的…

一起学docker系列之五docker的常用命令--操作容器的命令

目录 前言1 启动容器2 查看容器3 退出容器4 启动已经停止的容器5 重启容器6 停止容器7 删除已经停止的容器8 启动容器说明和举例9 查看容器日志10 查看容器内运行的进程11 查看容器内部细节12 进入正在运行的容器并进行交互13 导入和导出容器结语 前言 当涉及到容器化技术&…

对话芯动科技 | 助力云游戏 4K级服务器显卡的探索与创新

2021年芯动科技推出了基于IMG BXT GPU IP的风华1号显卡。单块风华1号显卡可在台式机和云游戏中实现4K级别的性能&#xff0c;渲染能力达到5 TFLOPS&#xff0c;如果在服务器中同时运行两块显卡&#xff0c;性能还可翻倍。该显卡是为不断扩大的安卓云游戏市场量身定制的&#xf…

代码随想录算法训练营第三十八天【动态规划part01】 | 动态规划理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯

动态规划理论基础 什么是动态规划 动态规划 (Dynamic Programming, DP)&#xff0c;是求解决策过程最优化的过程。 如果某一问题有很多重叠子问题&#xff0c;使用动态规划是最有效的。 所以动态规划中每一个状态一定是由上一个状态推导出来的&#xff0c;这一点就区分于贪…