-----------------------------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使用和内存分配的更多相关文章

  1. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  2. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  3. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

  4. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  5. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  6. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  7. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  8. # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)

    目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...

  9. Spring Boot 学习笔记(六) 整合 RESTful 参数传递

    Spring Boot 学习笔记 源码地址 Spring Boot 学习笔记(一) hello world Spring Boot 学习笔记(二) 整合 log4j2 Spring Boot 学习笔记 ...

  10. Redis学习笔记六:持久化实验(AOF,RDB)

    作者:Grey 原文地址:Redis学习笔记六:持久化实验(AOF,RDB) Redis几种持久化方案介绍和对比 AOF方式:https://blog.csdn.net/ctwctw/article/ ...

随机推荐

  1. Go-学习之路

    Go学习之路 环境搭建 基础知识 类型与变量 常量与运算符 控制语句 Array数组 slice切片 function函数 ...持续更新中

  2. python摸爬滚打之day14----内置函数,递归函数

    1.匿名函数 用一句话实现的简单函数. ret = lambda x : x ** 2      即 函数名 = lambda 形参 : 返回值 print(ret(5))  ----> 25 ...

  3. linux 内核启动流程分析,移植

    分析 linux-2.6.22.6 内核启动流程 移植 linux-3.4.2 到 JZ2440 开发板 Linux内核源码百度云链接: https://pan.baidu.com/s/1m1ymGl ...

  4. 什么是ELK

    为什么用到ELK: 一般我们需要进行日志分析场景:直接在日志文件中 grep.awk 就可以获得自己想要的信息.但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档.文本搜索太慢怎么办 ...

  5. WebSocket 的鉴权授权方案

    引子 WebSocket 是个好东西,为我们提供了便捷且实时的通讯能力.然而,对于 WebSocket 客户端的鉴权,协议的 RFC 是这么说的: This protocol doesn’t pres ...

  6. left join 太神奇了

    概念: 把left join左边的表的记录全部找出来.系统会先用表A和表B做个笛卡儿积,然后以表A为基表,去掉笛卡儿积中表A部分为NULL的记录.最后形成你的结果. 进行左连接时,就有涉及到主表.辅表 ...

  7. 006-优化web请求二-应用缓存、异步调用【Future、ListenableFuture、CompletableFuture】、ETag、WebSocket【SockJS、Stomp】

    四.应用缓存 使用spring应用缓存.使用方式:使用@EnableCache注解激活Spring的缓存功能,需要创建一个CacheManager来处理缓存.如使用一个内存缓存示例 package c ...

  8. asp.net中Request请求参数的自动封装

    这两天在测一个小Demo的时候发现一个很蛋疼的问题----请求参数的获取和封装,例: 方便测试用所以这里是一个很简单的表单. <!DOCTYPE html> <html xmlns= ...

  9. abap function module中的异常处理

    1: 定义一个有异常抛出的function module.  (zfm_moudle6),  该函数中有符合exceptions中的异常,将会自动将exceptions中的异常抛出. FUNCTION ...

  10. jenkins借助winscp传本地文件到远程服务器上

    有这样的场景,我们的ftp上都是些重要的资料,所以大家基本只有可看的权限,只有部分管理人员有可读可写的权限,但是jenkins上基本使用的都是ftp的路径,这个时候就存在一些问题,某些开发需要将自己构 ...