首页
chatGPT
关于
友链
其它
统计
更多
壁纸
留言
Search
1
cgroup--(4)cgroup v1和cgroup v2的详细介绍
6,535 阅读
2
修改Linux Kernel defconfig的标准方法
6,447 阅读
3
Android系统之VINTF(1)manifests&compatibility matrices
6,054 阅读
4
使用git生成patch和应用patch
3,570 阅读
5
c语言的__attribute__
3,183 阅读
默认分类
文章收集
学习总结
算法
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
Rust
工具
软件工具
Bug
COMPANY
登录
Search
标签搜索
Rust
shell
Linux
c
uboot
Vim
vintf
Linux驱动
Android
device_tree
git
DEBUG
arm64
链表
数据结构
IDR
内核
ELF
gcc
ARM
adtxl
累计撰写
380
篇文章
累计收到
16
条评论
首页
栏目
默认分类
文章收集
学习总结
算法
环境配置
知识点
入门系列
vim
shell
Git
Make
Android
Linux
Linux命令
内存管理
Linux驱动
Language
C++
C
Rust
工具
软件工具
Bug
COMPANY
页面
chatGPT
关于
友链
其它
统计
壁纸
留言
搜索到
35
篇与
的结果
2021-03-10
CPP基础--迭代器介绍
迭代器介绍可以使用下标运算符来访问string对象的字符或vector对象的元素,还有另外一种更通用的机制也可以实现同样的目的,这就是迭代器(iterator)。类似于指针类型,迭代器也提供了对对象的间接访问。就迭代器而言,其对象是容器中的元素或者string对象中的字符。使用迭代器可以访问某个元素,迭代器也能从一个元素移动到另外一个元素。1. 使用迭代器和指针不一样的是,获取迭代器不是使用取地址符,有迭代器的类型同时拥有返回迭代器的成员。比如,这些类型都拥有名为begin和end的成员,其中begin成员负责返回指向第一个元素(或第一个字符)的迭代器。如有下述语句:// b表示v的第一个元素,e表示v尾元素的下一位置 auto b = v.begin(), e = v.end(); // b和e的类型相同end成员则负责返回指向容器(或string对象)“尾元素的下一位置”的迭代器,也就是说,该迭代器指示的是容器的一个本不存在的“尾后”元素。这个迭代器没什么实际含义,仅是个标记而已,表示我们已经处理完了容器中的所有元素。end成员返回的迭代器常被称作尾后迭代器。如果容器为空,则begin和end返回的都是同一个迭代器,都是尾后迭代器。迭代器运算符和指针类似,也能通过解引用迭代器来获取它所指示的元素,执行解引用的迭代器必须合法并确实指示着某个元素。试图解引用一个非法迭代器或者尾后迭代器都是未被定义的行为。string s("some string"); if (s.begin() != s.end()) { // 确保s非空 auto it = s.begin(); // it表示s的第一个字符 *it = toupper(*it); // 将当前字符改写成大写形式 }将迭代器从一个元素移动到另外一个元素迭代器使用递增(++)运算符来从一个元素移动到下一个元素。因为end返回的迭代器并不实际指示某个元素,所以不能对其进行递增或解引用的操作。迭代器类型就像不知道string和vector的size_type成员到底是什么类型,一般来说我们也不知道(其实是无须知道)迭代器的精确类型。而实际上,那些拥有迭代器的标准库类型使用iterator和const_iterator来表示迭代器的类型:vector<int>::iterator it; // it能读写vector<int>的元素 string::iterator it2; // it2能读写string对象中的字符 vector<int>::const_iterator it3; // it3只能读元素,不能写元素 string::const_iterator it4; // it4只能读字符,不能写字符begin和end运算符begin和end返回的具体类型由对象是否是常量决定,如果对象是常量,begin和end返回const_iterator;如果对象不是常量,返回iterator为了便于专门得到const_iterator类型的返回值,C++11新标准引入了两个新函数,分别是cbegin和cend.不论vector对象本身是否是常量,返回值都是const_iterator。结合解引用和成员访问操作解引用迭代器可获得迭代器所指的对象,如果该对象的类型恰好是类,就有可能希望进一步访问它的成员。例如,对于一个由字符串组成的vector对象来说,要想检查其元素是否为空,令it是该vector对象的迭代器,只需检查it所指字符串是否为空就可以了,其代码如下,(*it).empty()为了简化上述表达式,C++定义了箭头运算符(->)。箭头运算符把解引用和成员访问两个操作结合在一起,也就是说,it->mem和(*item).mem表达的意思相同某些对vector对象的操作会使迭代器失效虽然vector对象可以动态地增长,但是也会有一些副作用。已知的一个限制是不能在范围for循环中向vector对象添加元素。另外一个限制是任何一种可能改变vector对象容量的操作,比如push_back,都会使该vector对象的迭代器失效。谨记,但凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。2. 迭代器运算string和vector迭代器提供了更多额外的运算符,一方面可使得迭代器每次移动跨过多个元素,另外也支持迭代器进行关系运算。所有这些运算被称作迭代器运算所谓两个迭代器之间的距离指的是右侧的迭代器向前移动多少位置就能追上左侧的迭代器,其类型是名为difference_type的带符号整型数。
2021年03月10日
870 阅读
0 评论
0 点赞
2021-03-09
CPP基础--变量和基本类型之处理类型
处理类型1. 类型别名类型别名(type alias)是一个名字,它是某种类型的同义词。使用类型别名还有很多好处,它让复杂的类型名字变得简单明了、易于理解和使用,还有助于清楚地知道使用该类型的真实目的。typedeftypedef double wages; // wages是double的同义词 typedef wages base, *p; // base是double的同义词,p是double*的同义词usingC++11标准规定了一种新的方法,使用别名声明(alias declaration)来定义类型的别名using SI = Sales-iteml // SI是Sales_item的同义词指针、常量和类型别名如果某个类型别名指代的是复合类型和常量,那么把它用到声明语句里就会产生意向不到的后果typedef char *pstring; const pstring cstr = 0; // cstr是一个指向char的常量指针 const pstring *ps; // ps是一个指针,它的对象是指向char的常量指针const是对给定类型的修饰,此时pstring实际上是一个指向char的指针,因此,const pstring就是指向char的常量指针,而非指向常量字符的指针。遇到一条使用了类型别名的声明语句时,人们往往会错误地尝试把类型别名替换成它本来的样子,以理解该语句的含义:const char *cstr = 0; // 是对const pstring cstr的**错误理解**声明语句中用到了pstring时,其基本数据类型是指针。可是用char*重写了声明语句后,数据类型就变成了char,*成为了声明符的一部分。这样改写的结果是,const char成了基本数据类型。2. auto类型说明符auto类型说明符,可以让编译器替我们去分析表达式所属的类型。使用auto也能在一条语句中声明多个变量。因为一条声明语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据类型都必须一样:auto i = 0, *p = &i; // 正确:i是整数、p是整型指针 auto sz = 0, pi = 3.14; // 错误:sz和pi的类型不一致复合类型、常量和auto编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始化规则。其次,auto一般会忽略掉顶层const,同时底层const则会保留下来,比如当初始值是一个指向常量的指针时:int i = 0, &r = i; auto a = r; const int ci = i, &cr = ci; auto b = ci; // b是一个整数(ci的顶层const特性被忽略掉了) auto c = cr; // c是一个整数 auto d = &i; // d是一个整型指针 auto e = &ci; // e是一个指向整数常量的指针(对常量对象取地址是一种底层const)如果希望推断出的auto类型是一个顶层const,则需要明确指出:const auto f = ci; // ci的推演类型是int,f是const int3. decltype类型指示符有时会遇到这种情况:希望从表达式的类型推断出要定义的变量的类型,但是不想用该表达式的值初始化变量。decltype,它的作用是选择并返回操作数的数据类型。在此过程中,编译器分析表达式并得到它的类型,却不实际计算表达式的值
2021年03月09日
808 阅读
0 评论
0 点赞
2021-03-09
CPP基础--变量和基本类型之自定义数据结构
暂无简介
2021年03月09日
754 阅读
0 评论
0 点赞
2021-03-08
C++标准库--关联容器
暂无简介
2021年03月08日
798 阅读
0 评论
0 点赞
2021-03-08
C++标准库--动态内存
暂无简介
2021年03月08日
790 阅读
0 评论
0 点赞
2021-03-08
C++标准库--泛型算法
暂无简介
2021年03月08日
790 阅读
1 评论
0 点赞
2021-03-08
C++标准库--IO库
暂无简介
2021年03月08日
679 阅读
0 评论
0 点赞
2021-03-08
C++标准库--顺序容器
暂无简介
2021年03月08日
719 阅读
0 评论
0 点赞
2021-03-08
CPP基础--类
暂无简介
2021年03月08日
676 阅读
0 评论
0 点赞
2021-03-08
CPP基础--表达式
暂无简介
2021年03月08日
662 阅读
0 评论
0 点赞
1
2
3
4