C++语法·识

news2024/12/4 15:11:35

    人生建议:请手机反省一下,为什么总拉着我熬夜。

目录

STL简介

string类·容器一

auto(自动声明类型)

简介:

特点

范围for(语法糖)

简介

特点

string

string类的常见接口

1.构造

2.容量操作

3.访问和遍历

4.修改与查找

5.string类非成员函数

6.string类的大小

VS

g++

小知识

——————————————————

STL简介

STL是主要用模版写的库,是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且也是一个包罗数据结构与算法的软件框架

全称:standard template libaray 标准模版库。

C++标准库包含很多库,如i/o流库、异常库、智能指针库等。

发展到现在,STL经过了原始版本(HP版本)、P.J版本、RW版本、SGI版本多个版本的迭代。

STL有六大组件:

容器(就是各种数据结构):string、vector、list、deque、map、set、multimap、multiset

空间配置器(给容器用的内存池):allocator

配接器:stack、queue、priority_queue

仿函数:greater、less......

算法:find、swap、reverse。sort、merge......

迭代器:iterator、const_iterator、reverse_iterator、const_reverse_iterator

string类·容器一

string由于比STL诞生的早,所以实际上属于标准库,但功能上算是容器。

auto(自动声明类型)

简介:

在C++11之前,使用auto修饰的变量,是具有自动储存器的局部变量,后来这个不重要了,C++11中,C++标准委员会赋予了auto新的含义:auto不再是一个储存类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时推导得到。

特点

1.用auto声明指针类型时,用auto和auto*没有什么区别,但用auto声明引用类型时必须加&

2.在同一语句声明多个变量时,这些变量必须是相同的类型,否则编译器会报错,因为编译器实际上只对第一个类型进行推导,然后用推导出来的类型定义其他变量。

3.auto不能作为函数的参数,可以做返回值,但是谨慎使用,因为在读代码时需要读的人自己去函数体中找返回值,降低了代码的可读性,尽量在做返回值时给注释。

auto不能用来直接声明数组。

范围for(语法糖)

简介

对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还容易犯错误。因此C++11中引入了基于范围的for循环。

特点

1.for循环后的括号中由 :分为两部分,第一部分时范围内用于迭代的变量,第二部分则表示被迭代的范围。  自动迭代,自动取数据,自动判断循环结束。

自动取arr中的数据放到ex中,自动++,自动判断结束,这里的ex的类型int也可以用auto来写。

2.范围for可以作用到数组和容器对象上进行遍历。

3.范围for的底层实际上是迭代器。

4.范围for在引用上的使用

因为是引用,所以连着a数组的值也发生了改变。

注意对自定义类型使用范围for时,会将其替换为自定义类型的迭代器,还有推荐在自定义类型时使用引用减少拷贝。

————————————————————

string

为了识别不同元素大小的串,string使用类模版来实现。

string类的常见接口

1.构造

(1)构造空的string类对象,即只有末尾自动添加的‘\0’的空字符串。

(2)用C格式的字符串来构造string类对象。

(3)string类对象中包含n个字符c

(4)拷贝构造函数

2.容量操作

(1)size 返回字符串有效字符长度,不算‘\0’

(2)length 返回字符串有效字符长度,不算'\0

size和length底层实现原理完全相同,引入size是为了与其他容器的接口保持一致,一般情况都使用size。

(3)capacity 返回空间总大小,不计算‘\0’

(4)empty 检测字符串是否为空串,是返回true,否则返回false

(5)clear 清空有效字符,但不清理空间

插入一个知识:

VS中的扩容机制:

VS是两段存储,小于16个字符存到数组里,大于等于就不在数组中存,而是动态开辟在堆区存,然后第一次动态开辟的空间是16的二倍扩容32,之后都是1.5倍扩容

linux中的扩容机制:

linux 没有两段储存,直接动态开辟在堆区存,每次扩容为2倍扩容。

(6)reserve 为字符串预留空间 ,reserve(size_t n=0)  一般用来开空间,

规则是如果n>capacity,capacity扩容到>=n

如果n<capacity,是否缩容看编译器,但一定不会对有效数据造成影响。       

比如,VS不缩容,但在linux中是n给多少就缩小到多少(在不对有效数据造成影响的前提下)。

用reserve开空间可以减少扩容小号的时间,提高效率。

(7)resize(size_t n)或(size_t n,char c)   将有效字符的个数改成n个,多出的空间如果未给指定字符用字符0填充,给指定字符用指定字符填充。

规则:

n<有效数据个数,删除数据,让size缩为n

字符串容量>n>有效数据个数 ,插入数据。

n>字符串容量,扩容+插入数据

(8)shrink_to_fit   缩容

对空间进行缩小,会将capacity 修改为 size的大小,少用,因为是异地缩容,耗费时间较多。  不过它只是一个建议,编译器会根据实际情况来选择是否缩容。

使用:字符串名.shrink_to_fit()

3.访问和遍历

(1)operator [ ]   ,[ ]是一个重载的运算符,使用和数组下标相同,字符串名[下标] 即可

这里size和length均可,不过推荐size。

上面的[ ]运算符访问只能针对数组进行访问,因为只有数组才有下标。

而下面的迭代器可以用于任何的数据结构。

(2)四种迭代器

正向迭代器

begin+end  begin获取一个字符的迭代器,end获取最后一个字符下一个位置的迭代器。 

auto自动识别迭代器类型      可以代替string::iterator 这个类型,方便。

while条件的比较不建议用>或<,因为迭代器如果用在数据结构时,数据结构的地址不一定连续,不能直接比较地址。

反向迭代器

rbegin+rend 

const 迭代器 和 const 反向迭代器

cbegin + cend crbegin + crend

使用const就不能修改这个迭代器的内容了。

注:迭代器不是指针 。       ‘ * '不是解引用,而是运算符重载。

(3)范围for         底层就是迭代器

例子上面有,这里就不放了,节省时间(不是偷懒)。

4.修改与查找

(1)push_back 在字符串后尾插字符c

会将原来'\0'的位置覆盖,然后在末尾自动添加'\0'。

(2)append  在字符串后追加一个字符串

同样会将原来‘\0’的位置覆盖,然后再末尾自动添加‘\0’。

append的多种重载函数

string (1)
string& append (const string& str);

就是追加一个字符串。

substring (2)
string& append (const string& str, size_t subpos, size_t sublen);

subpos为从传的字符串的subpos位置开始,sublen为追加长度,如果sublen大于传的字符串长度,只会追加全部传的字符串。

c-string (3)
string& append (const char* s);

用来面向C语言的指针类型字符串进行追加。

buffer (4)
string& append (const char* s, size_t n);

n为传过去的指针指向的字符串的需追加个数

fill (5)
string& append (size_t n, char c);

追加n个字符c

range (6)
template <class InputIterator>   string& append (InputIterator first, InputIterator last);

支持迭代器的追加。

initializer list(7)
string& append (initializer_list<char> il);

(3)operator += 在字符串后追加字符串或字符。

同理,两个string类对象相加也可以。

(4)c_str 返回C格式的字符串,也就是返回一个const char*类型的指针

(5)find(查找)大家族

find+npos  find(char c , size_t  pos=0) 从pos位置开始寻找字符c,找到则返回字符c的位置,未找到就返回npos,find的重载函数也如此,也可以寻找字符串。 有缺省值默认从开始位置开始找。

npos指的是size_t类型的-1,为整形最大值。

这里用有符号整形接收,所以打印出来是-1,否则就是整形最大值。

find有多种重载函数,可实现多种功能

string (1)
size_t find (const string& str, size_t pos = 0) const noexcept;

从pos位置开始在字符串中寻找字符串str

c-string (2)
size_t find (const char* s, size_t pos = 0) const;

从pos位置开始在字符串中寻找字符串s(C语言的指针格式)

buffer (3)
size_t find (const char* s, size_t pos, size_type n) const;

n指的是要取s这个数组中的前n个字符去和串匹配。

character (4)
size_t find (char c, size_t pos = 0) const noexcept;

和上面相似,在串中寻找字符。

还有其他寻找函数:

》find_first_of 功能和find重叠,重载函数与find基本相同。

》find_last_of 就是反向查找,其中pos的缺省值换为npos这个size_t 类型的-1,重载函数其余部分和find相同。

》find_first_not_of 重载函数的形式与find相同,功能为查找串中第一个与传过去的串无相同字符的位置。

》find_last_not_of 从后往前查找串中第一个与传过去的串无相同字符的位置,依旧和find_last_of相似。

》rfind ,重载函数还是和find相似,功能为将传的串反转,在串中从后向前查找传的串,返回的是成功匹配的最后一个位置,而find_last_of 返回的是成功匹配的第一个位置(从后往前的角度看)

substr 在str中从pos位置开始,截取n个字符,返回这些字符。

注:对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好

5.string类非成员函数

(1)operator+ 因为传拷贝返回,所以再深拷贝时效率很低,不推荐多用。

(2)operator << 输出运算符重载  一直在使用,就不贴演示了

(3)operator >> 输入运算符重载 

注意,cin默认以空格符和换行符区分多组输入。

(4)getline 未遇到换行符前可以一直获取字符串,默认以换行符为终止,可以自定义终止符。

(1)
istream& getline (istream& is, string& str, char delim);

(2)
istream& getline (istream& is, string& str);

(5)relational operators 字符串的比较运算符重载

有 == >= <= != > < 六种 比较规则和C语言中的strcmp相似

6.string类的大小
VS

VS编译器下string类为28字节大小

构成:先是有一个联合体用来定义string中字符串的储存空间:

—当字符串长度小于16时,使用内部固定的字符数组来存放。

—当字符串长度大于等于16时,从堆上开辟空间。

union _Bxty

{       // storage for small buffer or pointer to larger one

           value_type _Buf[_BUF_SIZE];

           pointer _Ptr;

           char _Alias[_BUF_SIZE]; // to permit aliasing

} _Bx;

这种设计的好处在:大多数情况下字符串的长度都小于16,在string对象创建好之后,内部已经有了16个字符数组的固定空间,不需要通过动态开辟空间,效率高。

其次:还有着一个size_t字段保存字符串长度,一个size_t字段保存从堆上开辟空间总的容量。

最后:还有一个指针做其他事情。

所以总共占:16+4+4+4=28个字节。

g++

g++下string的对象总共占4个字节,因为其全部由动态开辟空间来创建对象,内部只有一个指向堆空间的指针。

内部包含字段:空间总大小、字符串有效长度、引用计数、指向堆空间的指针。

struct _Rep_base

{

        size_type               _M_length;

        size_type               _M_capacity;

        _Atomic_word            _M_refcount;

};

小知识

1.构造函数不支持显式调用,析构函数支持。

2.在函数调用时,会开辟一块新栈帧,这个栈帧会存放函数的局部变量、参数等。

3.左开右闭相减为个数,例:数组下标0-9,,10个数据,10-0=10,    就是m-n为之间的元素数。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

蓝桥杯准备训练(lesson1,c++方向)

前言 报名参加了蓝桥杯&#xff08;c&#xff09;方向的宝子们&#xff0c;今天我将与大家一起努力参赛&#xff0c;后序会与大家分享我的学习情况&#xff0c;我将从最基础的内容开始学习&#xff0c;带大家打好基础&#xff0c;在每节课后都会有练习题&#xff0c;刚开始的练…

【开源】A059-基于SpringBoot的社区养老服务系统的设计与实现

&#x1f64a;作者简介&#xff1a;在校研究生&#xff0c;拥有计算机专业的研究生开发团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看项目链接获取⬇️&#xff0c;记得注明来意哦~&#x1f339; 赠送计算机毕业设计600个选题ex…

winform跨线程更新界面

前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任软件经理&#xff0c;从事C#上位机软件开发8年以上&#xff01;我们在开发C#程序的时候&#xff0c;有时候需要在非Ui主线程更新界面&#xff0c;为了…

无界(wujie)微前端项目搭建,nginx线上部署,pnpm一键安装依赖、启动应用,git代码仓库存放方式

这里写自定义目录标题 1. 创建项目项目目录布局选择主应用子应用 2. pnpm包管理&#xff0c;一键安装、启动、打包pnpm一键安装依赖npm-run-all 一键启动、打包 3. nginx线上部署主应用中子应用中nginx文件目录及配置 git代码存放方式 1. 创建项目 主应用&#xff1a; vue3vit…

10.容器-list列表

定义一个list使用[] 定义一个空列表 [] 或者 list() 列表中每个元素之间用逗号隔开 a_list [aa, bb, cc] print(a_list) # <class list> print(type(a_list)) list列表可以存储不同类型的元素 a_list [aa, bb, cc] print(a_list) # <class list> print(type…

BiGRU:双向门控循环单元在序列处理中的深度探索

一、引言 在当今的人工智能领域&#xff0c;序列数据的处理是一个极为重要的任务&#xff0c;涵盖了自然语言处理、语音识别、时间序列分析等多个关键领域。循环神经网络&#xff08;RNN&#xff09;及其衍生结构在处理序列数据方面发挥了重要作用。然而&#xff0c;传统的 RN…

PDF与PDF/A的区别及如何使用Python实现它们之间的相互转换

目录 概述 PDF/A 是什么&#xff1f;与 PDF 有何不同&#xff1f; 用于实现 PDF 与 PDF/A 相互转换的 Python 库 Python 实现 PDF 转 PDF/A 将 PDF 转换为 PDF/A-1a 将 PDF 转换为 PDF/A-1b 将 PDF 转换为 PDF/A-2a 将 PDF 转换为 PDF/A-2b 将 PDF 转换为 PDF/A-3a 将…

计费结算系统的架构设计思路

背景 近期负责关于集团的计费结算相关的系统&#xff0c;相对于2C系统的大流量&#xff0c;高并发的场景&#xff0c;计费和结算的信息对稳定性要求更高。对时效性要求并没有过于严苛的要求。那么接下来就和大家分享一下计费结算系统的架构设计。 模块划分 我们暂且将平台细分…

人工智障(5)

今天kimi把我气疯了&#xff0c;你们看原对话&#xff1a; 月之暗面最近在搞什么&#xff0c;不仅算力慢&#xff0c;而且回答离谱的要死&#xff0c;难道换老板了&#xff1f;

Python爬虫——城市数据分析与市场潜能计算(Pandas库)

使用Python进行城市市场潜能分析 简介 本教程将指导您如何使用Python和Pandas库来处理城市数据&#xff0c;包括GDP、面积和城市间距离。我们将计算每个城市的市场潜能&#xff0c;这有助于了解各城市的经济影响力。 步骤 1: 准备环境 确保您的环境中安装了Python和以下库&…

Python毕业设计选题:基于Flask的医疗预约与诊断系统

开发语言&#xff1a;Python框架&#xff1a;flaskPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 系统首页 疾病信息 就诊信息 个人中心 管理员登录界面 管理员功能界面 用户界面 医生…

Android 图形系统之二:ViewRootImpl

ViewRootImpl简介 ViewRootImpl 是 Android UI 系统的核心类之一&#xff0c;负责将 View 层级树与窗口管理器 WindowManager 联系起来。它是Android 应用视图的根节点&#xff0c;与 WindowManager 结合&#xff0c;实现视图的绘制、事件分发、窗口更新等功能。虽然 ViewRoot…

python通过ODBC连接神通数据库

1、安装神通数据库 2、安装python 3、安装pyodbc pip3 install pyodbc-5.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl 注&#xff1a;pyodbc要和python版本相对应 4、安装unixodbc 5、配置神通数据库ODBC数据源 6、示例代码如下 #!/usr/bin/python…

基于单片机的智能药箱设计

本设计主要由红外检测传感器、显示、独立按键、舵机、语音以及短信等模块组成。红外传感器模块主要对药仓中的药物数据进行采集&#xff0c;采集完毕由主控制器进行数据加工&#xff0c;之后可传送至显示模块上进行显示&#xff0c;在显示模块也可对显示时间、吃药倒计时、吃药…

【掩体计划——DFS+缩点】

题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e5 10; vector<vector<int>> g; bool st[N]; int ans 1e9; bool dfs(int f, int u, int dis) {bool is 1;for (auto j : g[u]){if (j f)continue;is & dfs(u, j, dis (g[u].…

无人机点云处理算法技术解析!

一、核心技术 数据预处理&#xff1a; 数据预处理是点云处理的第一步&#xff0c;主要包括滤波、去噪、数据压缩等。滤波技术可以去除点云数据中的噪声和孤立点&#xff0c;提高数据质量。常用的滤波方法包括双边滤波、高斯滤波等。 数据压缩则用于减少数据量&#xff0c;提…

Android13 允许桌面自动旋转

一&#xff09;需求-场景 Android13 实现允许桌面自动旋转 Android13 版本开始后&#xff0c;支持屏幕自动旋转&#xff0c;优化体验和兼容性&#xff0c;适配不同屏幕 主界面可自动旋转 二&#xff09;参考资料 android framework13-launcher3【06手机旋转问题】 Launcher默…

vue+uniapp+echarts的使用(H5环境下echarts)

1.安装 npm install echarts4.9.0 --save // 带版本号 2.main.js中全局引用 // import echarts from echarts // 如果是5.0以上版本用这个 import * as echarts from echarts Vue.prototype.$echartsecharts 3.使用 <template><view id"box" style"w…

探索仓颉编程语言:官网上线,在线体验与版本下载全面启航

文章目录 每日一句正能量前言什么是仓颉编程语言仓颉编程语言的来历如何使用仓颉编程语言在线版本版本下载后记 每日一句正能量 当你被孤独感驱使着去寻找远离孤独的方法时&#xff0c;会处于一种非常可怕的状态。因为无法和自己相处的人也很难和别人相处&#xff0c;无法和别人…

【Elasticsearch】Docker安装和基本概念

1. Docker安装ES 拉取es镜像 docker pull elasticsearch:8.5.3 创建网络 docker network create oj-network 启动es docker run -d --name oj-es-dev -e "ES_JAVA_OPTS-Xms256m -Xmx256m" -e "discovery.typesingle-node" -v D:\javacode\oj-byte\depl…