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

目录

1 什么是string

2 迭代器 

2.1 迭代器的使用

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

3 构造函数


string - C++ Reference

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位置构造子串

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

①迭代器

②指针

 

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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android File Transfer(安卓文件传输工具)

Android File Transfer 是一款安卓文件传输工&#xff0c;它允许在Mac操作系统和Android设备之间进行文件传输。 该软件通过USB连接将文件从Mac电脑传输到连接的Android设备&#xff0c;或者反过来从Android设备传输文件到Mac电脑。这包括照片、视频、音乐、文档和其他文件类型…

从iddata函数生成的结构体数据中获取时间序列、输入序列和输出序列

从iddata函数生成的结构体数据中获取时间序列、输入序列和输出序列 在使用iddata函数生成结构体数据后&#xff0c;有时需要单独使用其中的时间序列&#xff0c;输入序列和输出序列&#xff0c;此时需要对iddata生成的数据进行分析&#xff0c;以获得所需数据。本文说明读取时…

特征缩放和转换以及自定义Transformers(Machine Learning 研习之九)

特征缩放和转换 您需要应用于数据的最重要的转换之一是功能扩展。除了少数例外&#xff0c;机器学习算法在输入数值属性具有非常不同的尺度时表现不佳。住房数据就是这种情况:房间总数约为6至39320间&#xff0c;而收入中位数仅为0至15间。如果没有任何缩放&#xff0c;大多数…

CAD长方形纤维插件2D

插件介绍 CAD长方形纤维插件2D版本可用于在AutoCAD软件内生成随机分布的长方形纤维图形&#xff0c;生成的dwg格式模型可用于模拟二维随机分布的纤维复合材料、随机初始裂缝等&#xff0c;同时模型可导入COMSOL、Abaqus、ANSYS、Fluent等有限元软件内进行仿真分析计算。 插件…

关于ASO优化的分步入门指南1

欢迎阅读我们的应用商店优化&#xff08;ASO&#xff09;分步指南&#xff0c;接下来我们将引导大家完成ASO研究的初始步骤&#xff0c;为提高应用程序的知名度和吸引自然下载奠定基础。 1、确定竞争对手。 首先确定应用程序的直接和间接竞争对手。我们可以通过咨询客户或进行…

掌握深度学习利器——TensorFlow 2.x实战应用与进阶

掌握深度学习利器——TensorFlow 2.x实战应用与进阶 摘要&#xff1a;随着人工智能技术的飞速发展&#xff0c;深度学习已成为当下最热门的领域之一。作为深度学习领域的重要工具&#xff0c;TensorFlow 2.x 备受关注。本文将通过介绍TensorFlow 2.x的基本概念和特性&#xff…

Spring Cloud -熔断器Hystrix

为什么需要服务降级或熔断 微服务架构与传统架构的一个显著区别就是服务变多了&#xff0c;任何一个服务调用失败、或者服务不可用&#xff0c;都会对整个应用造成影响。比如前段时间阿里云整体业务不可用&#xff0c;有多方猜测就是阿里云的某一个关键服务不可用导致的。 服…

python_面向对象中的特殊成员

一、几个常见的特殊成员 # 都只是语法&#xff0c;无特殊意义 class Foo(object):def __init__(self,a1,a2):self.a1 a1self.a2 a2def __call__(self,*args,**kwargs):print(11111,args,kwargs)return 123def __getitem__(self, item):print(item)return 8def __setitem__(s…

【左程云算法全讲13】暴力递归

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于左程云算法课程进行的&#xff0c;每个知识点的修正和深入主要参考…

csapp attack lab phase4

csapp attack lab phase4 每个gadget由一系列指令字节组成&#xff0c;最后一个字节为0xc3&#xff0c;编码为ret指令。 举个例子: 48 89 c7 是指令 movq %rax, %rdi&#xff0c; 对应的地址是0x400f15 0x3 也就是0x400f18, 是开始的指令位置。 例如&#xff1a; ret编码为0…

YOLO目标检测——无人机检测数据集下载分享【含对应voc、coco和yolo三种格式标签】

实际项目应用&#xff1a;无人机识别数据集说明&#xff1a;无人机检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(json)和yolo(txt)三种格式标签…

MySQL数据库下载及安装教程(最最新版)

MySQL数据库下载及安装教程&#xff08;最最新版&#xff09; 一、下载mysql数据库二、安装Mysql三、验证是否安装成功&#xff08;一&#xff09;、命令提示符cmd窗口验证&#xff08;二&#xff09;、MySQL控制台验证 一、下载mysql数据库 进入MySQL官方网站&#xff08;htt…