C++ string的基本概念
文章目录
- 1. 什么是string?
- 2. auto和范围for的使用
- 2. 1 auto
- 2. 2 范围for
- 3. 迭代器的概念、const string的概念
- 3. 1 迭代器的概念
- 3. 2 const string的概念
1. 什么是string?
在了解什么是string之前,我们首先需要知道字符串是什么。在C语言中,字符串是指以’\0’结尾的一些集合。同时为了操作方便,C语言也提供了一些库函数用来操作这些字符串。
但是,这些函数与字符串是分离开的,不符合OOP的思想------(面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。)。同时需要用户自己管理底层空间,稍不留神就会出现越界访问。
所以为了替代C语言原本令人诟病的字符串体系,就有了string的诞生。因此,可以认为string是C++的字符串控制体系。
2. auto和范围for的使用
2. 1 auto
在C++11之后,标准委员会赋予auto全新的意义:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。
auto作为语法糖,实际上是为了方便程序员进行更方便的操作。下面的代码就是全部的使用。
C++20开始支持
//void Func1(auto x)
//{
//
//}//auto做函数返回值,以函数实际 return 返回的值的类型为类型
//不建议使用auto做函数的返回值。因为函数返回值使用auto的话,确认函数返回值的类型就会变得麻烦
auto Func(int x)
{auto y = x;return y;
}//auto和范围for的使用
int main()
{//auto的使用auto x1 = 1;//auto根据实际对象(1)来自动推断类型auto x2 = 1.1;auto x3 = "hello world";int x4 = 1;int& x5 = x4;auto x6 = x5;//auto无法判断类型是否是引用,只能根据引用的对象来判断类型,也就是引用对象的类型就是auto的类型//然而 auto 诞生的主要目的不是代替这些类型。而是代替一些过长的类型//例如list<int> It;//定义一个list对象ItIt.push_back(1);It.push_back(2);It.push_back(3);It.push_back(4);//往对象里面尾插1 2 3 4list<int>::iterator it1 = It.begin();//定义一个list的迭代器it1,it1指向list对象It的第一个位置,list<int>::iterator是类型auto it2 = It.begin();//定义一个list的迭代器it2,it2指向list对象It的第一个位置,auto自动推导类型,因此省去了写前面的一长串while (it2 != It.end()){it2++;}//另一个例子std::map<std::string, std::string> dict;std::map<std::string, std::string>::iterator dit1 = dict.begin();auto dit2 = dict.begin();//auto代替的就是 std::map<std::string, std::string>::iterator 这一迭代器的类型//因此auto可以减轻程序员的编写负担。要是经常需要写那么长一串的类型的话,本来就没剩几根的头发也是岌岌可危了//函数的形参为auto,C++20之后才开始支持//Func1();//函数返回类型为auto,参数为int,函数返回值为intFunc(1);return 0;
2. 2 范围for
范围for的出现和auto一致,均是为了方便程序员而推出的语法糖。
int main()
{// 范围for的使用// 适用于容器遍历和数组遍历// 原理:范围for底层是迭代器string s1("hello world");//范围for会把右边的参数自动赋值给左边的变量,左边的变量自动++,直到为空//自动取容器的数据赋值给左边的对象//自动++,自动判断结束for (auto ch : s1){//s1的值自动赋值给ch,ch自动++cout << ch << " ";}cout << endl;//由于范围for是把右边的值赋值给左边的变量,再对左边的变量进行操作,因此就会出现for (auto ch : s1){ch++;cout << ch << " ";//这里s1的值成功++,并且打印出来}cout << endl;for (auto ch : s1){cout << ch << " ";//这里s1的值不变。说明上面的++是将s1拷贝给ch,再在ch中操作,没有对s1本身做出改变}cout << endl;//如果想要在范围for里面改变s1,就需要使用引用for (auto& ch : s1)//引用,传址操作{ch++;}for (auto ch : s1){cout << ch << " ";}cout << endl;//还有另一种情况需要使用引用。当赋值的本体过大,因此拷贝的代价过大,就需要使用引用//那么,使用引用之后不想要对本体做出改变怎么办?使用constfor (const auto& ch : s1){//ch++;//编译器报错}//范围for的使用对象除了容器,还有数组int a[] = { 1,2,3,4,5,6,7,8 };//正常使用for循环去打印for (size_t i = 0; i < sizeof(a) / sizeof(int); i++){cout << a[i] << " ";}cout << endl;//使用范围for去打印for (auto ch : a){cout << ch << " ";}cout << endl;return 0;
}
3. 迭代器的概念、const string的概念
3. 1 迭代器的概念
在了解string是怎么使用之前,我们首先需要知道迭代器的存在。
迭代器(iterator),可以理解为一种像指针、能完成指针所有操作的对象。其定义为:提供一种方法,使之能够依次寻访某个容器所包含的所有元素,而又无需暴露该容器底层的结构。
由于迭代器本身是抽象的概念,所以会配合下面的代码进行说明。
//迭代器的概念
int main()
{string s1("Hello world!");//在C++中,我们想要访问string中的字符串,有两种方式//1.下标//这里之所以能使用下标,是因为在string这个容器中,有关于[]运算符的重载,所以能直接使用[]//下标的使用的是有前提的。就是对象的存储空间必须是线性的。如果是链表或者树,那么下标的性能就会大幅下降cout << "下标:";for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << " ";}cout << endl;//2.迭代器cout << "迭代器:";//string::iterator 说明这是容器 string 的迭代器。it1是实例化的迭代器,可以理解成像s1的指针。但是绝对不是指针,迭代器是全新的概念string::iterator it1 = s1.begin();//it1指向的是s1的开头while (it1 != s1.end())//这里的end指向的不是world的d,而是d的下一位,通常是"\0"{cout << *(it1++) << " ";}cout << endl;//迭代器也有反向的cout << "反向编译器:";string::reverse_iterator rit = s1.rbegin();//这里rit指向的是world中的dwhile (rit != s1.rend())//这里的rend指向的也不是hello中的h,而是h的前一位{cout << *(rit)++ << " ";//这里的++意味着,反向迭代器不仅仅是定义的反向,运算符重载的方向也是反向的}return 0;
3. 2 const string的概念
//const string 对象
int main()
{string s1("Hello world!");//const string对象必须使用const修饰的迭代器const string s2(s1);//const_iterator 和 const iterator的区别:前者限定的是迭代器指向的内容,后者限定的是迭代器本身//限定迭代器本身的话,就会因为迭代器无法改变,而没办法让 it1++ 访问后面的内容//string::const_iterator it1 = s2.begin();auto it1 = s2.begin();while (it1 != s2.end()){//*it1 += 1;//const 修饰的对象,无法改变大小cout << *it1++ << " ";//但是可以改变迭代器的大小,从而改变指向的位置}cout << endl;//const反向迭代器string::const_reverse_iterator rit1 = s2.rbegin();while (rit1 != s2.rend()){cout << *rit1++ << " ";}cout << endl;return 0;
}
相关文章:
C++ string的基本概念
文章目录 1. 什么是string?2. auto和范围for的使用2. 1 auto2. 2 范围for 3. 迭代器的概念、const string的概念3. 1 迭代器的概念3. 2 const string的概念 1. 什么是string? 在了解什么是string之前,我们首先需要知道字符串是什么。在C语言中…...

MAC虚拟机上安装WDA环境
MAC虚拟机上安装WDA环境 一、MAC虚拟机切换root权限二、macOS上安装xcode若你的macOS系统可以在appstore下载安装若你安装的macOS系统版本太低,无法在appstore上安装xcode 三、macOS上安装WebDriverAgent四、使用xcode配置WDA安装到手机上高版本系统支持 一、MAC虚拟…...

与 Cursor AI 对话编程:2小时开发报修维修微信小程序
本文记录了如何通过与 Cursor AI 对话,全程不写一行代码的情况下,完成一个完整的报修小程序。整个过程展示了 AI 如何帮助我们: 生成代码 、解决问题、优化实现、完善细节。 先看一下效果图: 一、项目配置 首先我是这样和 AI 对…...

leetcode-73.矩阵置零-day5
class Solution {public void setZeroes(int[][] mat) {int m mat.length, n mat[0].length;// 1. 扫描「首行」和「首列」记录「首行」和「首列」是否该被置零boolean r0 false, c0 false;for (int i 0; i < m; i) {if (mat[i][0] 0) {r0 true;break;}}for (int j …...

CSS学习记录13
CSS组合器 组合器是解释选择器之间关系的某种机制。CSS选择器可以包含多个简单选择器。在简单选择器之间,我们可以包含一个组合器。 CSS中有四种不同的组合器: 后代组合器(空格)子选择器(>)相邻兄弟选择器&#…...

CAD图纸加密软件哪个最好用 | 安全可靠的解决方案
CAD图纸加密软件哪个最好用 | 安全可靠的解决方案 图纸文件泄密事件频发,给企业带来了严重的商业损失、技术秘密泄露、公共安全威胁以及信誉损害。 为了应对这一挑战,选择一款既安全可靠又易于使用的CAD图纸加密软件显得尤为重要。 在众多加密软件中&a…...

基于SSM+Vue的宠物医院管理系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
处理VUE框架中,ElementUI控件u-table空值排序问题
按照以下步骤进行操作: 分离数据:首先,将原始数据按照username为空和非空进行分类。对非空表进行排序:对非空表按照username进行升序排序。合并表格:将空表和排序后的非空表合并,保证空表挂接在排序后的非…...

专业140+总分400+北京理工大学826信号处理导论考研经验北理工电子信息与通信工程,真题,大纲,参考书。
考研总分400,专业826信号处理导论(信号与系统和dsp)140,成功上岸北理工,虽然已经一段时间,但是后劲很大,每每回想还是昨日事,群里同学多次要求分享自己的一些经验,感谢大…...
Rocky DEM tutorial5_Drop Weight test_落锤试验
tutorial5_Drop Weight test_落锤实验 文章目录 tutorial5_Drop Weight test_落锤实验0. 目的1. 模型介绍2. 模型设置2.1 设置Physics2.2 导入几何2.3 定义进口面2.4 设置motion frames2.5 设置边界条件2.6 设置材料2.7 设置 materials interactions2.8 设置 Particles2.9 设置…...

C#,在 C# 语言中将 LaTeX 转换为 PNG 或 JPG 图像
在 C 语言中将 LaTeX 转换为 PNG 或 JPG 图像# 12月 28, 2021 2 分钟 法尔汉拉扎 在 C 语言中将 TeX 转换为 PNG JPG 图像# TeX 格式用于处理技术和科学文件。它通常用于交流或发布此类文档。在某些情况下,您可能需要将 TeX 文件渲染为 PNG 或 JPG 等图像…...
Elasticsearch:Mapping-映射
一、创建索引 自动生成索引字段数据类型即自动映射 创建之前,先删除索引防止重复创建 删除索引: DELETE product_mapping创建索引 product_mapping并且赋值 PUT /product_mapping/_doc/1 {"name": "xiaomi phone","desc": "s…...
安装Tensorflow@FreeBSD(失败)
pkg 安装,失败,找不到:pkg: No packages available to install matching science/py-tensorflow have been found in the repositories ports安装 cd /usr/ports/science/py-tensorflow make install 报错: 按照提示重新发命令 make DISABLE_VULNERA…...

API接口示例:电商商品评论数据
当然,以下是一个简化的电商商品评论数据API接口的示例。请注意,这只是一个示例,实际的API接口可能会更加复杂,并且会包含更多的验证、错误处理和安全措施。 API接口示例:电商商品评论数据 基础信息 API名称…...

使用idea创建一个JAVA WEB项目
文章目录 1. javaweb项目简介2. 创建2.1 idea新建项目2.2 选择,命名2.3 打开2.4 选择tomcat运行2.5 结果 3. 总结 1. javaweb项目简介 JavaWeb项目是一种基于Java技术的Web应用程序,主要用于开发动态网页和Web服务。这种项目能够构建在Java技术栈之上&a…...
解决MyBatis在 Oracle 中使用 IN 语句不能超过 1000 问题
在 Oracle 数据库中,IN 语句常用于查询某个字段是否属于一组特定的值。对于大多数开发者而言,IN 是一种简单直观的查询方式,能够提升开发效率,避免过多的 OR 语句。然而,许多人在使用 IN 语句时可能遇到一个问题&#…...

最长递增子序列两种算法实现(动态规划,二分查找)
恭喜你刷到博主 DP 经典题目详解部分第一期,想学好 DP 请关注订阅,会持续更新!!!!! 建议先阅读DP算法入门 00001 最长递增子序列(Longest Increasing Subsequence,简写…...

Deepmotion技术浅析(三):特征提取
DeepMotion 的特征提取模块是整个动作捕捉和 3D 追踪流程的基础,负责从输入的视频帧中提取出具有代表性的视觉特征。这些特征将被用于人体姿态估计、动作识别、3D 重建等后续任务。 包括: 1.图像特征提取 卷积神经网络(CNN) 卷…...

国内CentOS使用yum安装docker和docker-compose
安装docker 安装需要的软件包, yum-util 提供yum-config-manager功能,另两个是devicemapper驱动依赖 yum install -y yum-utils device-mapper-persistent-data lvm2下载yum源采用阿里云的镜像源 wget -O /etc/yum.repos.d/docker-ce.repo https://mi…...

python学opencv|读取图像(十三)BGR图像和HSV图像互相转换深入
【1】引言 前序学习过程中,我们偶然发现:如果原始图像是png格式,将其从BGR转向HSV,再从HSV转回BGR后,图像的效果要好于JPG格式。 文章链接为: python学opencv|读取图像(十二)BGR图…...
数学建模期末速成 聚类分析与判别分析
聚类分析是在不知道有多少类别的前提下,建立某种规则对样本或变量进行分类。判别分析是已知类别,在已知训练样本的前提下,利用训练样本得到判别函数,然后对未知类别的测试样本判别其类别。 聚类分析 根据样本自身的属性…...

H_Prj06_03 8088单板机串口读取8088ROM复位内存
1.8088CPU复位时,CSFFFFH,IP0000H,因此在ROM的逻辑地址FFFF:0000(FFF0H)处一般要防止一个长跳转指令LJMP(机器码位EAH) 2.写一个完整的8086汇编程序,通过查询方式检测串口接收符串‘r’&#x…...

Qt/C++学习系列之Excel使用记录
Qt/C学习系列之Excel使用记录 前言The process was ended forcefully.解决方式断点查语句问题 总结 前言 在项目中解析条目达50多条,并且都需要将对应的结果进行显示。为了将结果显示的更加清晰,考虑采用QTableWidget进行表格设置,而在使用过…...

【超详细】英伟达Jetson Orin NX-YOLOv8配置与TensorRT测试
文章主要内容如下: 1、基础运行环境配置 2、Torch-GPU安装 3、ultralytics环境配置 4、Onnx及TensorRT导出详解 5、YOLOv8推理耗时分析 基础库版本:jetpack5.1.3, torch-gpu2.1.0, torchvision0.16.0, ultralytics8.3.146 设备的软件开发包基础信息 需…...

蓝耘服务器与DeepSeek的结合:引领智能化时代的新突破
🌟 嗨,我是Lethehong!🌟 🌍 立志在坚不欲说,成功在久不在速🌍 🚀 欢迎关注:👍点赞⬆️留言收藏🚀 🍀欢迎使用:小智初学…...
AI API、AI 聊天助手,两大服务助力应用智能化转型
网络效应、转换成本——这些一度定义了我们这个时代商业逻辑的规则,在 AI 时代迅速崩塌。创新性功能被无差别克隆包围,差异化优势在底层能力翻新中消散…… 更别说那些决策迟缓、行动无法言出法随的“后来者”,注定与市场窗口擦身而过。唯快…...

Readest(电子书阅读器) v0.9.53
Readest 是一款开源电子书阅读器,专为沉浸式和深度阅读体验而设计。它是对Foliate的现代重写,利用Next. js 15和Tauri v2在macOS、Windows、Linux和Web上提供无缝的跨平台体验,并即将支持移动平台。 软件特色 多格式支持 支持EPUB、MOBI、K…...

解决数据库重启问题
最近部署软件时,发现mysql会一直在重启,记录下解决办法: 1.删除/home/dataexa/install/docker/datas/mysql路径下的data文件夹 2.重新构建mysql docker-compose up -d --build mysql 3.停掉所有应用,在全部重启: do…...
【方案分享】蓝牙Beacon定位精度优化(包含KF、EKF与UKF卡尔曼滤波算法详解)
蓝牙Beacon定位精度优化:KF、EKF与UKF卡尔曼滤波算法详解 标签:蓝牙定位|Beacon|卡尔曼滤波|UKF|EKF|RSSI|室内定位|滤波算法|精度优化 相关分享:…...

IDEA中的debug使用技巧
详细教学视频见b站链接:IDEA的debug调试 CSDN详细博客文章链接:debug文章学习 以下为个人学习记录总结: idea中的debug模式界面如下: 现在详细介绍图标作用: 图标一(Show Execution Point)&…...