c++-----STL容器系列(1) vector

1 介绍

Vector是stl容器中一种常见的容器 ,基本和数组类似,其大小(size)可变,常用于数组长度不确定时来代替数组,当数据超过vector预定值时vector将自动扩容。

Vector是一种顺序存储器,在内存中连续排列,可以通过下标访问,时间复杂度为O(1)。

2 创建和使用

使用时需要包含头文件

1 #include<vector>

声明一个int型的vector数组

1 Vector<int> asd; 一个空数组
2 Vector<int> asd1 {1,2,3,4,5}; 包含1、2、3、4、5个变量
3 Vector<int> asd2(9); 开辟9个空间,且默认值为0
4 Vector<int> asd3(3,5); 3个值为5的数组
5 Vector<int> asd4(asd3); 复制asd3的所有值
6 Vector<int> asd5(asd4.begin(),asd4.end()); 将asd4的值从头到尾复制
7 Vector<int> asd6(asd4.rbegin(),asd4.rend()); 将asd4的值从未到头复制

方法

名字

描述

begin

返回指定容器中第一个元素的迭代器

end

返回指定容器最后一个元素所在位置后一个位置的迭代器

Size

返回实际元素的个数

Max_size

返回元素个数的最大值

empty

判断vector是否为空

at

Vector.at(i)等同于vector[i],访问数组下标的元素

front

返回第一个元素

back

返回最后一个元素

Push_back

在容器尾部插入元素

Pop_back

删除最后一个元素

insert

插入元素

erase

删除元素

swap

两元素交换

capacity

可容纳的大小

3具体用法

3.1 遍历

 1 //范围for循环
2 for(auto num :asd){
3 Cout<num<<endl;
4 }
5 //下标访问
6 for(int i=0;i<asd.size();i++){
7 Cout<<asd[i]<<endl;
8 }
9 //迭代器访问
10 for(vector<int>::iterator it=asd.begin();it!=asd.end();it++){
11 cout<<*it<<endl;
12 }

3.2容量和大小

resize改变size的大小,而reserve改变capacity的大小

1 Vector<int> asd;
2 Asd.resize(4);
3 Asd.reserve(6);
4 Cout<<asd.size()<<””<<asd.capacity()<<endl;

3.3vector常用算法

3.3.1push_back和pop_back

1 Vector<int> asd;
2 For(int i=0;i<9;i++){
3 Asd.push_back(i);
4 }
5 For(int i=0;i<9;i++){
6 Asd.pop_back();
7 }

3.3.2 erase

erase通过迭代器删除某个或者某个范围的元素,并返回下一个元素的迭代器

1 Vector<int> asd{1.、2、3、4、5、6};
2 Asd.erase(asd.begin()+2);
3 //删除asd开头往后偏移两个位置的元素

3.3.3 swap和clear

1 vector<int> asd={5,4,3,2,1};
2 Vector<int> asd1={1,2,3,4,5};
3 Asd.swap(asd1);
4 //swap将两个vector进行交换
5 Asd.clear();
6 //clear清空整个vector,size变为0

3.4 vector二维操作

定义一个二位的数组

1 Vector<vector<int>> asd;

定义一个5行三列且全为1的二维数组

1 Vector<vector<int>> asd(5,vector<int>(3,1));

访问

 1 //For循环访问
2 For(int i=0;i<asd.size();i++){
3 For(int j=0;j<asd[0].size();j++){
4 Cout<<asd[i][j]<<endl;
5 }
6 }
7 For(auto nums :asd){
8 For(auto num :nums){
9 Cout<<num<<endl;
10 }
11 }

4 vector扩容原理

扩容原理概述

  • 新增元素:vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素;
  • 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器都失效;
  • 初始时刻vector的capacity为0,塞入第一个元素后capacity增加到1;
  • 在不同编译器实现的扩容方式不一样,VS015中以1.5倍扩容,GCC以2倍扩容

以下是vs中vector的扩容源码

总结

  • vector在push_back以成倍增长可以在均摊后达到O(1)的事件复杂度,相对于增长指定大小的O(n)时间复杂度更好。
  • 为了防止申请内存的浪费,现在使用较多的有2倍与1.5倍的增长方式,而1.5倍的增长方式可以更好的实现对内存的重复利用。

c++复习笔记——STL(vector)的更多相关文章

  1. STL源码剖析读书笔记之vector

    STL源码剖析读书笔记之vector 1.vector概述 vector是一种序列式容器,我的理解是vector就像数组.但是数组有一个很大的问题就是当我们分配 一个一定大小的数组的时候,起初也许我们 ...

  2. 树的直径,LCA复习笔记

    前言 复习笔记第6篇. 求直径的两种方法 树形DP: dfs(y); ans=max( ans,d[x]+d[y]+w[i] ); d[x]=max( d[x],d[y]+w[i] ); int di ...

  3. 状压DP复习笔记

    前言 复习笔记第4篇.CSP RP++. 引用部分为总结性内容. 0--P1433 吃奶酪 题目链接 luogu 题意 房间里放着 \(n\) 块奶酪,要把它们都吃掉,问至少要跑多少距离?一开始在 \ ...

  4. C++ STL vector容器学习

    STL(Standard Template Library)标准模板库是C++最重要的组成部分,它提供了一组表示容器.迭代器.函数对象和算法的模板.其中容器是存储类型相同的数据的结构(如vector, ...

  5. Java基础复习笔记系列 九 网络编程

    Java基础复习笔记系列之 网络编程 学习资料参考: 1.http://www.icoolxue.com/ 2. 1.网络编程的基础概念. TCP/IP协议:Socket编程:IP地址. 中国和美国之 ...

  6. Java基础复习笔记系列 八 多线程编程

    Java基础复习笔记系列之 多线程编程 参考地址: http://blog.csdn.net/xuweilinjijis/article/details/8878649 今天的故事,让我们从上面这个图 ...

  7. Java基础复习笔记系列 七 IO操作

    Java基础复习笔记系列之 IO操作 我们说的出入,都是站在程序的角度来说的.FileInputStream是读入数据.?????? 1.流是什么东西? 这章的理解的关键是:形象思维.一个管道插入了一 ...

  8. Java基础复习笔记系列 五 常用类

    Java基础复习笔记系列之 常用类 1.String类介绍. 首先看类所属的包:java.lang.String类. 再看它的构造方法: 2. String s1 = “hello”: String ...

  9. Java基础复习笔记系列 四 数组

    Java基础复习笔记系列之 数组 1.数组初步介绍? Java中的数组是引用类型,不可以直接分配在栈上.不同于C(在Java中,除了基础数据类型外,所有的类型都是引用类型.) Java中的数组在申明时 ...

  10. STL vector

    STL vector vector是线性容器,它的元素严格的按照线性序列排序,和动态数组很相似,和数组一样,它的元素存储在一块连续的存储空间中,这也意味着我们不仅可以使用迭代器(iterator)访问 ...

随机推荐

  1. 无法下载安装文件,请检查internet连接

    win10 vs2019下提示visual studio installer无法下载安装文件,请检查internet连接     1.打开"网络和Internet设置",更改适配器 ...

  2. Unity2020或Unity2019安装后无法启动

    无法启动Unity 下载国际版的Unity2020,双击Unity.exe无法启动,通过Unity Hub也无法启动 ​ 原因 通过查看unity hub的日志发现Unity 启动的时候会检查 lie ...

  3. 【深度学习项目二】卷积神经网络LeNet实现minst数字识别

    相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...

  4. Win32汇编:数组与标志位测试总结

    整理复习汇编语言的知识点,以前在学习<Intel汇编语言程序设计 - 第五版>时没有很认真的整理笔记,主要因为当时是以学习理解为目的没有整理的很详细,这次是我第三次阅读此书,每一次阅读都会 ...

  5. C/C++ Qt QThread 线程组件应用

    QThread库是QT中提供的跨平台多线程实现方案,使用时需要继承QThread这个基类,并重写实现内部的Run方法,由于该库是基本库,默认依赖于QtCore.dll这个基础模块,在使用时无需引入其他 ...

  6. 【链表】单链表的介绍和基本操作(C语言实现)【保姆级别详细教学】

    单链表 文章目录 前言 单链表基本介绍 基本结构 与顺序表的区别以及学习单链表的必要性 单链表的实现 结点的定义以及头指针的创建 单链表的遍历(打印接口的实现)[重点] 开辟结点接口 尾插接口 尾删接 ...

  7. javascript按钮通过cookie限制60s后才可以点击

    javascript按钮通过cookie限制60s后才可以点击 1️⃣ 首先创建一个html页面,放入一个按钮 2️⃣ 设置点击按钮的触发函数 一般当点击按钮都会有一些业务需要,在需求结束后,触发sa ...

  8. CH59X/CH58X/CH57X sleep模式下串口唤醒收发数据

    整体程序逻辑: 下方的具体程序及使用是基于CH592进行的 SLEEP模式睡眠唤醒是由协议栈管理的,还在睡眠时,无法接收到数据. 已经通过使能HAL_SLEEP开启睡眠.如果需要在睡眠时实时接收串口传 ...

  9. delphi TThread.WaitFor 用法

    在 Delphi 中,TThread.WaitFor 方法用于等待一个线程完成执行.当你创建一个线程并希望主线程(或其他线程)等待这个线程结束时,你可以使用这个方法. 以下是 TThread.Wait ...

  10. 从零开始的react入门教程(四),了解常用的条件渲染、列表渲染与独一无二的key

    壹 ❀ 引 在从零开始的react入门教程(三),了解react事件与使用注意项一文中,我们了解了react中事件命名规则,绑定事件时对于this的处理,以及事件中可使用的e对象.那么这篇文章中我们来 ...