c++学习笔记(六)- vector使用和内存分配
-----------------------------2019/01/15-------------------------------
复习了下迭代器,其实c++参考里讲的很清楚,主要需要辨析规则如下:
1. begin()指向vector第一个元素, end()指向vector最后一个元素的下一个地址(尾后迭代器off-the-end iterator);
2. insert()是向当前地址前插入,返回第一个插入的元素地址;
3. erase()是从当前地址开始,向后删除,返回删除以后的下一个地址,如果删除到最后一个元素,返回end()
具体如图:

--------------------2019.01.19-------------------------------------------------------------------------
vector添加时间:push_back<尾部insert<头部insert
clock_t start, finish;
std::vector<int> v_data, v_data2, v_data3; start = clock();
for(int i = ;i<;i++){
int data = std::rand()%;
v_data.push_back(data);
}
finish = clock();
printf("\npush_back used %.2f ms\n", (double)(finish-start)*/CLOCKS_PER_SEC); start = clock();
for(int i = ;i<;i++){
int data = std::rand()%;
v_data2.insert(v_data2.end(), data);
}
finish = clock();
printf("\ninsert form tail used %.2f ms\n", (double)(finish-start)*/CLOCKS_PER_SEC); start = clock();
for(int i = ;i<;i++){
int data = std::rand()%;
v_data3.insert(v_data3.begin(), data);
}
finish = clock();
printf("\ninsert form head used %.2f ms\n", (double)(finish-start)*/CLOCKS_PER_SEC);
输出:
push_back used 5.43 ms
insert form tail used 8.39 ms
insert form head used 2081.38 ms
-------------------2019.02.06---------------------------------------
据说emplace_back()比push_back()更快
-------------------2019.02.09---------------------------------------
判断两个vector是否相等:
1. 如果[1,6] [6,1]是不同的vector,直接用==判断即可,stl内置
2. 如果不考虑元素顺序,且内部没有重复元素,可以用set实现,但是对[1,1,2] vs. [1,2,1]这种无力
3. 针对1 2不适用的情况,自己琢磨着可能需要先排序再逐个比较
-------------------2019.02.27--------------------------------------
vector的初始化
// 二维
vector<vector<int>> test = {{,},{,}};
for(int i=;i<test.size();i++){
for(int j=;j<test[i].size();j++){
std::cout<<test[i][j]<<" ";
}
std::cout<<std::endl;
}
// 一维
vector<int> desp = {, , , , , };
for(int i=;i<desp.size();i++){
std::cout<<desp[i]<<" ";
}
输出:

没见过这种初始化方法,之前一直是定义一个数组a[],然后vector<int> v(a,a+sizeof(a)/sizeof(int)),觉得还怪麻烦的,难道是c++新特性?
1. 定义
vector 是C++容器种特别常用的一种,用法:vector<int> a;c++11里定义了6种构造函数。
int aNum[] = { , , , , , , , , , };
vector<int> myVector(,); //定义一个2个元素的vector,并初始化为1
for (auto it = myVector.begin(); it != myVector.end(); it++)
cout << *it << ' ';
cout << endl;
//用数组aNum的值初始化vector
vector<int> myNum(aNum, aNum + sizeof(aNum) / sizeof(int));
for (auto it = myNum.begin(); it != myNum.end(); it++)
cout << *it << ' ';
cout << endl;
//截取myNum的后半部分
int medium = myNum.size() / ;
vector<int> new_nums((myNum.begin() + medium), myNum.end());
for (auto it = new_nums.begin(); it != new_nums.end(); it++)
cout << *it << ' ';
cout << endl;
//去除myNum向量的前5个元素
myNum.erase(myNum.begin(), myNum.begin() + 5);
输出:

2. insert
根据 c++ STL中的vector在内存中的分配与释放,vector内容和数组一样,是连续分配内存空间的,不同的是,在给vector分配内存时,会比实际需要的多一些,预留出以后插入的空间。
根据 c++ reference, 对vector.insert的描述,当向vector的末尾(vector.end())插入时,直接插入就好了,除非预留空间不够,才会重新分配内存。
如果向vector中间的某个位置插入,那么,由于vector的底层实现还是数组,插入点以后的所有节点都需要重新分配内存。
这样操作效率很低,所以如果需要向序列中间插入元素,c++ reference建议使用链表。

3. size
myVector.size()返回vector里有多少个有效的元素,不是vector实际占用的存储空间。
myVector.resize(n,val)改变的是vector包含有效元素的个数,如果n<ori,直接扔掉多的那些;n>ori,末尾增加n-ori个新元素,根据val值初始化。如果n超过了capacity,要重新分配内存。
myVector.capacity返回给vector分配的存储空间。

c++学习笔记(六)- vector使用和内存分配的更多相关文章
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
- Go语言学习笔记六: 循环语句
Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...
- # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)
目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...
- Spring Boot 学习笔记(六) 整合 RESTful 参数传递
Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...
- Redis学习笔记六:持久化实验(AOF,RDB)
作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...
随机推荐
- 20165336 2017-2018-2 《Java程序设计》第1周学习总结
20165336 2017-2018-2 <Java程序设计>第1周学习总结 教材学习内容总结 Java地位.特点:Java具有面向对象.与平台无关.安全.稳定和多线程等优良特性.Java ...
- Apache SSL 服务搭建
Web服务器在默认情况下使用HTTP,这是一个纯文本的协议.正如其名称所暗示的,纯文本协议不会对传输中的数据进行任何形式的加密.而基于HTTP的Web服务器是非常容易配置,它在安全方面有重大缺陷.任何 ...
- qemu-kvm内存虚拟化1
2017-04-18 记得很早之前分析过KVM内部内存虚拟化的原理,仅仅知道KVM管理一个个slot并以此为基础转换GPA到HVA,却忽略了qemu端最初内存的申请,而今有时间借助于qemu源码分析下 ...
- file 选取文件/文件夹
一般网页上传文件大家都会用到这个标签 <input type="file" id="file_input"/> 我们可以通过这个标签选取文件,使用j ...
- Hadoop 尝试
一. 使用环境Ubuntu 安装Hadoop需要的软件 命令: $ sudo apt-get install ssh $ sudo apt-get install rsync 提示错误: 错误原因: ...
- MySQL 5.7 新特性大全和未来展望
引用 美图公司数据库高级 DBA,负责美图后端数据存储平台建设和架构设计.前新浪高级数据库工程师,负责新浪微博核心数据库架构改造优化,以及数据库相关的服务器存储选型设计.之前在「高可用架构」发表的&l ...
- 下载apk安装包后,调用安装器自动安装apk(适配7.0)
在更新操作时,下载新apk之后,往往需要自动安装新apk,用以下代码即可安装下载在本地的apk文件(apkFile) Intent intent = new Intent(); intent.setA ...
- Pycharm增加新安装Python的路径
Pycharm默认的Python是python2,但是如果代码是python3写的,就需要在pycharm里的project interpreter增加python3 注意,一定要找到Project ...
- Java 基础 常用API (System类,Math类,Arrays, BigInteger,)
基本类型包装类 基本类型包装类概述 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类 ...
- shell for 循环数组
name=(aa bb) ;i<${#name[*]};i++)) do name=${name[i]} echo "$name" done