-----------------------------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. Linux命令小计

    一.yum和apt-get的区别 Linux系统下安装包格式有:rpm包和deb包. pm包主要应用在RedHat系列包括 Fedora等发行版的Linux系统上 deb包主要应用于Debian系列包 ...

  2. xpath定位方法详解

    1.xpath较复杂的定位方法: 现在要引用id为“J_password”的input元素,可以像下面这样写: WebElement password = driver.findElement(By. ...

  3. css自动换行如何设置?url太长会撑开页面

    我们更新文章时如果有引用其他文章一般会带一个原文url,但这个链接如果太长的话会把内容的版块撑开,整个排版乱了.那我们能不能设置css自动换行呢?如下图所示,其实只要两个样式就能搞定 word-wra ...

  4. 20170929 微信小程序项目开发

    1. 微信小程序环境搭建 请参考官网,哈哈! 2. 微信小程序基础学习 文件结构: 3. 微信小程序实战 4. 目前的逻辑,是从微信小程序的界面和服务器的Web API 进行交互, 有个注意事项就是W ...

  5. socket 套接字总结

    简单版 服务端 import socket import struct import json import os server_dir = r'E:\Moudule_1\socket练习\serve ...

  6. 算法面经之讯飞+CVTE

    一.科大讯飞(合肥) 概况:刚经历了科大讯飞的初面,大概35分钟左右,问的内容比较笼统,主要针对简历上的内容来,面试官比较亲切,回忆了一下面试内容. 建议:把简历上的内容整吧清楚,不知道的别瞎写,写了 ...

  7. golang 中创建daemon的方法

    https://github.com/takama/daemon https://github.com/immortal/immortal/blob/master/fork.go            ...

  8. SSH服务知识

    1.ssh介绍 SSH 是 Secure Shell Protocol 的简写,由 IETF 网络工作小组(Network Working Group )制定:在进行数据传输之前,SSH先对联机数据包 ...

  9. [js]Object.defineProperty等几个js特殊方法

    Object.defineProperty var obj = { test: "hello" }; obj['favor'] = 'orange'; //对象已有的属性添加特性描 ...

  10. 546A

    #include <stdio.h> int main() { int n1,n2,n3; int ans; scanf("%d %d %d", &n1, &a ...