-----------------------------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. schtasks 命令使用

    schtasks  /create 创建任务,下面是常用参数 /tn taskname /tr taskrun /sc schedule    [Minute | Hourly | Daly | We ...

  2. C++ 方阵原地旋转90度

    不额外申请内存(另外的一个二维数组空间),将一个方阵(二维数组)原地旋转90度,主要的思路是,由外向内,一圈圈的进行旋转(就是依次进行交换),如下图所示,当这些圈圈都交换完了之后,就完成了原地旋转了. ...

  3. JVM java垃圾回收机制

    一.jvm简介 1.JVM内存运行时数据区的三个重要的地方 1.1.堆(heap):它是最大的一块区域,用于存放对象实例数组,是全局共享的. 1.2.栈(stack):全称为虚拟机栈,主要存储基本数据 ...

  4. windows安装nginx并存放静态资源

    1.将nginx-windows.zip下载下来,然后点击nginx.exe 如果一闪而过并且打开网页输入localhost显示无法访问,打开error.log文件:No mapping for th ...

  5. 初试GH-OST(转)

    最近老板让做一个gh-ost和pt-osc 的对比测试,本文将对两者做对比. 一.原理和所用说明   PT-OSC GH-OST 原理 1.创建一个和要执行 alter 操作的表一样的新的空表结构(是 ...

  6. LVS基础知识

    LVS介绍(Linux Virtual Server) 负载调度器,已经集成到内核 工作原理:VS根据请求报文的目标IP和目标协议及端口将其调度转发至某RS,根据调度算法来挑选RS iptables/ ...

  7. asxios--form data提交,setcookie

    React native 项目,部分接口用form data 提交,以及在Android端,虽然设置了请求携带cookie,但每次请求携带的cookie跟初始化时都不一样,目前做法是去到初始化中返回的 ...

  8. v-show 和 v-if 对 v-chart的影响

    借鉴:https://blog.csdn.net/xiaxiangyun/article/details/78909991 使用v-show控制tab切换 其中一个tab数据请求后显示第二个tab,第 ...

  9. EOS account 中的 Threshold 和 weight 使用

    https://eoscity.io/f/viewtopic.php?f=7&t=17 这篇文章的原文:   (https://steemit.com/eos/@genereos/eos-mu ...

  10. javaScript 数组迭代方法

    map 方法 解释:map即映射,返回对每项操作后组成的新数组 let arr=[1,2,3,4,5,6,7,8]; let newArr=arr.map((item)=>{ if(item&g ...