| |
|
开发:
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简介 vector中的first指针和last指针指向第一个元素之前,end指针指向最后一个元素的后面,所以first-last就是vector的容量,也就是capacity,first-last是元素的个数,也就是size it->和it就是对象本身,如果不希望元素的值被改变,可以将迭代器定义为常性迭代器 要想cout << cit->Value() << endl;和cout << (*cit).Value() << endl;能够编译通过,Object中的Value()必须是常方法,如果没有普通方法,普通对象既可以调用普通方法,也可以调用常方法,优先调用普通方法,常对象只能调用常方法 6.下面程序AB是否可以编译通过? 答案:A可以编译通过,B不能编译通过
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循环是什么时候结束的? 将auto改成Object也是可以编译通过的 答案:对于内置类型来说,上面的方法好一些,因为如果使用的是引用,实际上是把数组元素的地址给了x,输出的时候,要对内存访问两次,而第一种方法是把元素的值直接拷贝给x,打印的时候直接打印就行了,只需要对内存访问一次 使用的时候根据需求来使用不同的方式,如果想要改变value的值,就使用第二种方式,如果不想改变value的值,只是想打印,就使用第一种方式 先将四个Object对象构建出来,存放到初始化链表中,再将对象依次拷贝构造到vector中,当执行resize的时候,当前容量小于10,所以要扩容,先构造6个Object对象,然后将之前空间的4个对象拷贝构造到新的空间中,然后析构原来空间的对象,当程序结束时,将10个对象析构 如果在执行objvec.resize(2),那么他会析构8个对象,剩余两个,也就是缩容,但是容量还是8,而不是2 new和malloc都是从堆区开辟空间,但是new还会调用构造函数,new在底层调用的还是malloc,只不过new进行了封装,让他有了调用构造函数的能力 12.在C11标准中,可以通过下面的方式进行初始化,为了达到统一,就有了一个初始化列表 objvec.assign(10,Object(100));会将原来的对象全部析构掉,新构造出10个Object(100) 当容量的大小远远大于有效元素的个数,就需要回收空间 注意:交换的时候交换的是指针,是objvec的first、last、end指针和tmp的first、last、end进行对应交换 注意:交换一定是块作用域,目的就是回收空间,交换完以后将原来的空间回收才能到达回收空间的目的,如果交换完以后不回收,之前的空间就还遗留在,也就是说这次交换就没有意义
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语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |