IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 250-C++ STL vector -> 正文阅读

[C++知识库]250-C++ STL vector

1.vector简介
在这里插入图片描述
2.先构建的是4个无名对象,再将4个无名对象拷贝构造到指定的空间以后,需要析构无名对象,当程序结束时,再析构4个Object对象

vector中的first指针和last指针指向第一个元素之前,end指针指向最后一个元素的后面,所以first-last就是vector的容量,也就是capacity,first-last是元素的个数,也就是size
在这里插入图片描述
3.普通迭代器可以改变元素的值,it->Value()返回的是引用类型,可以修改value的值

it->和it就是对象本身,如果不希望元素的值被改变,可以将迭代器定义为常性迭代器
在这里插入图片描述
**4.常性迭代器的常性修饰的是指向,所以++it是可以的,但是
it,it->Value() += 100;是不可以的**

要想cout << cit->Value() << endl;和cout << (*cit).Value() << endl;能够编译通过,Object中的Value()必须是常方法,如果没有普通方法,普通对象既可以调用普通方法,也可以调用常方法,优先调用普通方法,常对象只能调用常方法
在这里插入图片描述
5.可以通过下标访问objvec[i].Value(),可以通过函数访问objvec.at(i).Value(),可以通过普通迭代器访问,也可以通过常性迭代器访问

6.下面程序AB是否可以编译通过?

答案:A可以编译通过,B不能编译通过
const修饰的是迭代器本身,所以迭代器指向的对象的值是可以改变的,但是迭代器本身不可以改变
在这里插入图片描述
上面问题和下面程序的道理差不多,const修饰的是p本身,所以++p是错误的,*p += 100;是正确的

typedef int *PINT
const PINT p = &a;
*p += 100;//ok
++p;//error

7.x可以推演出是一个Object类型,不是迭代器类型

下面程序会出现什么问题?

答案:出现没必要的副本

先将Object(10)拷贝给x,输出x.Value(),然后析构,再将Object(20)拷贝给x,输出,再将Object(30)拷贝给x,输出…在这个过程中进行了反复的拷贝构造和析构

注意:对于内置类型来说,上面的这种方法很好,对于自定义类型来说,最好将auto x : objvec改成auto &x : objvec,这样就可以减少拷贝构造的过程

如果不希望修改value的值,可以将auto &x : objvec改为const auto &x : objvec

for循环是什么时候结束的?
答案:当遍历完vec中的元素以后,for循环结束

将auto改成Object也是可以编译通过的
在这里插入图片描述
8.下面两种使用方式有什么区别呢?

答案:对于内置类型来说,上面的方法好一些,因为如果使用的是引用,实际上是把数组元素的地址给了x,输出的时候,要对内存访问两次,而第一种方法是把元素的值直接拷贝给x,打印的时候直接打印就行了,只需要对内存访问一次

使用的时候根据需求来使用不同的方式,如果想要改变value的值,就使用第二种方式,如果不想改变value的值,只是想打印,就使用第一种方式
在这里插入图片描述
9.如果要扩容的大小比当前的容量要小,说明容量足够用了,就不需要进行扩容,如果要扩容的大小比当前的容量要大,就扩容,将原来的数据拷贝构造到新开辟的空间中,再将原来的空间析构掉
在这里插入图片描述
如果迭代器指向第一个元素,obj引用的是最后一个元素,那么在扩容之后,迭代器迭代的空间被释放掉,obj引用的对象也被释放掉,所以所有的迭代器,包含尾后迭代器和所有到元素的引用都被非法化了
在这里插入图片描述
10.resize

先将四个Object对象构建出来,存放到初始化链表中,再将对象依次拷贝构造到vector中,当执行resize的时候,当前容量小于10,所以要扩容,先构造6个Object对象,然后将之前空间的4个对象拷贝构造到新的空间中,然后析构原来空间的对象,当程序结束时,将10个对象析构

如果在执行objvec.resize(2),那么他会析构8个对象,剩余两个,也就是缩容,但是容量还是8,而不是2
在这里插入图片描述
在这里插入图片描述
11.new和malloc的区别

new和malloc都是从堆区开辟空间,但是new还会调用构造函数,new在底层调用的还是malloc,只不过new进行了封装,让他有了调用构造函数的能力

12.在C11标准中,可以通过下面的方式进行初始化,为了达到统一,就有了一个初始化列表
在这里插入图片描述
13.assign用法

objvec.assign(10,Object(100));会将原来的对象全部析构掉,新构造出10个Object(100)
在这里插入图片描述
14.回收空间

当容量的大小远远大于有效元素的个数,就需要回收空间

注意:交换的时候交换的是指针,是objvec的first、last、end指针和tmp的first、last、end进行对应交换

注意:交换一定是块作用域,目的就是回收空间,交换完以后将原来的空间回收才能到达回收空间的目的,如果交换完以后不回收,之前的空间就还遗留在,也就是说这次交换就没有意义

在这里插入图片描述
15.两个插入函数,push_back和insert,从效率上来讲,push_back要比insert高的多的多

push_back如果空间足够的情况下,直接在尾部插入的效率为O(1),insert插入需要移动数据,效率比较低

注意:不管是哪个插入可能会使迭代器失效,注意是可能,当插入的时候如果空间不足,需要扩容到原来的1.5倍,那么之前迭代器迭代的空间已经被释放了,所以就会导致迭代器失效,如果空间足够,那么就不会导致迭代器失效,因为之前迭代的空间还在

16.原位构造

原位构造就是在指定的位置构造

原位构造的效率要比push_back的效率要高

原位构造构造的时候直接在位置上进行构建,调用的是定位new,100作为Object的构造函数的参数,直接构造一个Object对象

push_back(100);先用100构建出Object对象,构建出来的对象由于是无名对象,所以调用移动构造函数构建到位置中,因为push_back插入的是Object类型,所以一般情况下写成push_back(Object(100));的形式,它是先构建无名对象,然后讲无名对象移动构造到位置上,然后再将无名对象析构掉

带一个参数的构造函数可以将数值转换成对象,所以push_back(100)的时候会先将100转换成无名对象

将变量转成对象,靠的就是构造函数,如果不想将变量隐式转成对象,可以在构造函数前面加上explicit关键字,在将变量转成对象的时候,就需要明确告知转成什么类型的对象

将对象转换成变量,要重载函数,或者直接强转
在这里插入图片描述

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-13 21:33:09  更:2022-03-13 21:33:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:59:22-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码