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/ ...
随机推荐
- 【Mock】mock基础、简单的单元测试代码练习。
说到接口测试,必问 mock,mock 通俗一点来说就是模拟接口返回.解决接口的依赖关系,主要是为了解耦,单元测试用的多. 什么是Mock unittest.mock 是一个用于在 Python 中进 ...
- 搭建简单SBT工程实践
在本机jdk(主要配置环境变量).scala(主要配置环境变量).sbt(主要配置①私服repositories ②sbtconfig.txt)都已经安装且配置好的情况下. repositories ...
- linux中cmake语法的学习
在linux 下进行开发很多人选择编写makefile 文件进行项目环境搭建,而makefile 文件依赖关系复杂,工作量很大,搞的人头很大.常常,写代码,效率才是王道.这里还有自动化的项目构建工具C ...
- php合并数组并保留键值的方法
答案:使用 + 连接两个数组,替换array_merge()函数. php合并数组,一般会使用array_merge方法. array_merge — 合并一个或多个数组 array array_me ...
- (转)EOSIO开发(四)- nodeos、keosd与cleos
前一篇文章介绍了EOSIO中钱包.账户与账户权限的概念,这一篇文章继续学习EOSIO系统的主要组件,包括nodeos.keosd以及cleos. 本文执行的命令都是基于Docker环境,请先下载Doc ...
- leetcode的注意点
读懂一个题其实非常非常重要,读懂题包括要读懂题的问题是什么,条件是什么,考察的是什么知识点.所以能够读懂题就已经成功一半了,但是如果没有读懂题目就开始答题,就不假思索地乱写答案,那么会事倍功半,还得返 ...
- [LeetCode] 577. Employee Bonus_Easy tag: SQL
Select all employee's name and bonus whose bonus is < 1000. Table:Employee +-------+--------+---- ...
- [LeetCode] 414. Third Maximum Number_Easy
Given a non-empty array of integers, return the third maximum number in this array. If it does not e ...
- ios9 适配的坑
http://www.cocoachina.com/ios/20151016/13715.html
- 20165321实验一 Java开发环境的熟悉
一.idea调试: 二.实验内容: 实现学生成绩管理功能(增删改,排序,查找),并进行测试(正常情况,异常情况,边界情况). 运行截图: 代码: public class Student { Stri ...