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图…...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join
纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
