C++ 数组(vector)常用操作总结

2023-05-16

目录

1、vector对象的定义和初始化方式

2、vector 常用基础操作

3、使用迭代器的遍历、插入、删除操作

4、vector 元素的重排操作(排序、逆序等)

5、vector 中找最值

6、改变vector大小 及其 内存分配机制

7、vector数组 与 内置数组 的选择问题


1、vector对象的定义和初始化方式

常用的初始化方式及作用如下:

vector 中的数据类型 T 可以代表任何数据类型,如 int、string、class、vector(构建多维数组) 等,就像一个可以放下任何东西的容器,因此 vector 也常被称作容器。字符串类型 string 也是一种容器,c++ 中的不同种类的容器拥有很多相同的操作,因此 string 的很多操作方法可以直接用在 vector 中。

vector<T> v1v1 是一个元素类型为 T 的空 vector
vector<T> v2(v1)使用 v2 中所有元素初始化 v1
vector<T> v2 = v1同上
vector<T> v3(n, val)v3 中包含了 n 个值为 val 的元素
vector<T> v4(n)v3 中包含了 n 个默认值初始化的元素
vector<T> v5{a, b, c...}使用 a, b, c... 初始化 v5
vector<T> v1同上

vector<vector<int>> matrix(M,vector<int>(N));

二维数组初始化

2、vector 常用基础操作

 下表列出了 添加元素、查询、索引、赋值、比较 等常用操作方法。

v.empty()如果 v 为空则返回 true,否则返回 false
v.size()返回 v 中元素的个数
v.push_back(val)

向 vector 的尾端添加值为 val 的元素。

注意:vector 不支持 push_front 操作。

v.pop_back(val)

删除尾元素,返回void。vector同样 不支持 pop_front 操作。若想在同时弹出元素的值,就必须在执行弹出之前保存它(可以使用 v.back())。

v[n]返回 v 中第 n 个位置上元素的引用,不能用下标操作添加元素
v.back()返回 v 中最后一个元素的引用
v.front()返回 v 中第一个元素的引用
v1 = v2用 v2 中的元素替换 v1 中的元素
v1 = {a, b, c...}用元素 {a, b, c...} 替换 v1 中的元素
v1 == v2当且仅当拥有相同数量且相同位置上值相同的元素时,v1 与 v2 相等
v1 != v2自行体会
<, <=, >, >=以字典序进行比较

3、使用迭代器的遍历、插入、删除操作

迭代器类似于指针,提供了对象的间接访问,但获取迭代器并不是使用取地址符。如果将指针理解为元素的“地址”,那么迭代器可以理解为元素的“位置”。可以使用迭代器访问某个元素,迭代器也能从一个元素移动到另一个元素。

一个迭代器的范围由一对迭代器表示,分别为 begin end。其中 begin 成员返回指向第一个元素的迭代器;end 成员返回容器最后一个元素的下一个位置(one past the end),也就是指向一个根本不存在的尾后位置,这样的迭代器没什么实际含义,仅是个标记而已,表示已经处理完了容器中的所有元素。所以 begin end 表示的是一个左闭右开的区间 [ begin end)

迭代器可以用来实现容器的遍历插入等操作,可以细品下面的例子:

1、遍历

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main(void)
{
    vector<string> a{"0", "1", "2", "3", "4", "5", "6", "7", "8"};
    auto it = a.begin();  // 返回一个迭代器类型,一般来说我们并不关心迭代器具体的数据类型
    while(it != a.end())
    {
        cout << *it << " ";
        it++;
    }
    return 0;
}
// 运行结果 //
0 1 2 3 4 5 6 7 8 

2、插入

插入操作的函数:

v.insert(p, n, val) :在迭代器 p 之前插入 n 个值为 val 的元素,返回新添加的第一个元素的迭代器。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main(void)
{
    vector<int> a{1, 2, 3, };
    auto it1 = a.begin();  // 返回一个迭代器类型,一般来说我们并不关心迭代器具体的数据类型
    auto it2 = a.insert((it1+1), {6, 7, 8});  // 利用迭代器在第二个元素之前插入数据
    cout << *it2 << endl;  // 返回的是新插入元素第一个元素的迭代器
    auto it = a.begin();  // 
    while(it != a.end())
    {
        cout << *it << " ";
        it++;
    }
    return 0;
}
// 输出结果 //
6
1 6 7 8 2 3

3、删除 

删除操作的函数:

v.erase(p) :删除迭代器 p 所指的元素,返回指向被删除元素之后元素的迭代器。

v.erase(b, e) :删除迭代器 b, e 之间的元素,返回指向最后一个被删除元素之后元素的迭代器。

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main(void)
{
    vector<int> a{1, 2, 3, };
    auto it1 = a.begin();  // 返回一个迭代器类型,一般来说我们并不关心迭代器具体的数据类型
    auto it2 = a.erase(it1+1);  // 删除元素 2
    cout << *it2 << endl;  // 返回的是新插入元素第一个元素的迭代器
    auto it = a.begin();  // 
    while(it != a.end())
    {
        cout << *it << " ";
        it++;
    }
    return 0;
}
// 运行结果 //
3
1 3

4、vector 元素的重排操作(排序、逆序等)

容器的重排需要用到头文件 <algorithm> 中的算法

1、排序 sort()

使用到的函数为 sort() :按输入序列的字典序升序排序,原位操作,无返回值函数原型:

void std::sort<std::vector<int>::iterator>(std::vector<int>::iterator, std::vector<int>::iterator)

举例:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(void)
{
    vector<int> a{2, 0, 2, 2, 0, 3, 0, 9};
    sort(a.begin(), a.end());  //原位操作
    for(int i:a)
        cout << i << " ";
    return 0;
}
// 输出结果 //
0 0 0 2 2 2 3 9 

2、消除相邻的重复元素 unique()

使用到的函数为 unique() :将输入序列相邻的重复项“消除”,返回一个指向不重复值范围末尾的迭代器,一般配合 sort() 使用,函数原型:

std::vector<int>::iterator std::unique<std::vector<int>::iterator>(std::vector<int>::iterator, std::vector<int>::iterator)

举例:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(void)
{
    vector<int> a{2, 0, 2, 2, 0, 3, 0, 9};
    sort(a.begin(), a.end());  // 先排序
    for(int i:a)   cout << i << " "; // 输出
    cout << endl;
    auto end_unique = unique(a.begin(), a.end());  //将输入序列相邻的重复项“消除”,返回一个指向不重复值范围末尾的迭代器
    a.erase(end_unique, a.end()); // 删除末尾元素
    for(int i:a)   cout << i << " "; // 输出
    return 0;
}
// 运行结果 //
0 0 0 2 2 2 3 9 
0 2 3 9

3、逆序 reverse()

方法1:使用到的函数为 reverse() :将输入序列按照下标逆序排列,原位操作,无返回值函数原型:

void std::reverse<std::vector<int>::iterator>(std::vector<int>::iterator, std::vector<int>::iterator)

 方法2:使用greater<int>() 作为参数(内置函数)

sort(nums.begin(), nums.end(), greater<int>());

 举例:

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main(void)
{
    vector<int> a{2, 0, 2, 2, 0, 3, 0, 9};
    reverse(a.begin(), a.end());  // 原位逆序排列
    for(int i:a)   cout << i << " "; // 输出
    return 0;
}
// 运行结果 //
9 0 3 0 2 2 0 2 

5、vector 中找最值

容器的重排同样需要用到头文件 <algorithm> 中的算法。

1、最大值 auto it = max_element(v.begin, v,end()),返回最大值的迭代器,函数原型如下:

constexpr std::vector<int>::iterator std::max_element<std::vector<int>::iterator>(std::vector<int>::iterator, std::vector<int>::iterator)

2、最小值 auto it = min_element(v.begin, v,end()),返回最小值的迭代器,函数原型如下:

constexpr std::vector<int>::iterator std::min_element<std::vector<int>::iterator>(std::vector<int>::iterator, std::vector<int>::iterator)

3、相对位置大小 auto b = distance(x, y),x、y 是迭代器类型,返回 x、y 之间的距离,可以用来获取最大/小值的索引,函数原型如下:

std::ptrdiff_t std::distance<std::vector<int>::iterator>(std::vector<int>::iterator __first, std::vector<int>::iterator __last)

举例:

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(void)
{
    vector<int> a({0,1,-2,3});
    auto b = distance(a.begin(), min_element(a.begin(), a.end()));
    cout << a[b] << endl;
    return 0;
}
// 输出 //
-2

6、改变vector大小 及其 内存分配机制

与内置数组一样,vector 的所有元素必须存放在一片连续的内存中,但 vector 的大小可变性使得其所占用的内存大小也是可变的。

为了避免每次改变 vector 时重新分配内存空间再将原来的数据从新拷贝到新空间的操作,标准库实现者采用了减少容器空间重新分配次数的策略:当不得不获取新空间时,vector(string 也是如此)通常会分配比需求更大的空间作为预留的备用空间,这样就减少了重新分配空间的次数。

  • 改变 vector 的大小可以使用 v.resize(n, t) 函数,调整 v 的大小为 n 个元素,任何新添加的元素都初始化为值 t

举例:

#include <iostream>
#include <vector>
using namespace std;

int main(void)
{
    vector<vector<int>> a;
    a.resize(3, vector<int>(3));
    cout << "row : " << a.size() << endl;
    cout << "col : " << a[0].size() << endl;
    return 0;
}
// 输出 //
row : 3
col : 3
  • 函数 v.resize(n)  可以用来告知容器分配至少能分配 n 个元素的内存空间。并不改变容器中元素的数量,仅影响 vector 预先分配多大的内存空间

7、vector数组 与 内置数组 的选择问题

一般来说,我们在使用 C++ 编程时会将 vector 类型的数据与类似于使用 a[N] 定义的内置数组统称为数组,两者是很类似的数据结构,在一般的任务中使用 vector数组 与使用内置数组通常没有什么区别。两者的区别主要如下:

  • vector数组 是 C++ 的标准库类型,即使用 vector 定义的变量本质上是定义了一个 vector 类的对象。而类似于使用 a[N] 定义的数组是内置数组,类似于 int、float 等内置类型的变量。
  • vector数组 的大小可变,而内置数组类型在定义时必须明确定义大小,之后大小不能变化。因为内置数组的大小固定,因此对某些特殊的应用来说程序运行时的性能较好,但是也失去了一定的灵活性。

如果不确定元素的确定个数,那么 vector 就是最好的选择。 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 数组(vector)常用操作总结 的相关文章

  • windows7安装ubuntu双系统教程

    转载自 xff1a http www cnblogs com masbay p 10745170 html windows7安装ubuntu双系统教程 一 先搞清楚自己电脑的类型 xff1a 本次安装的Ubuntu的电脑类型是MBR传统bi
  • STM32 串口详解

    目录 01 USART的特点 02 USART简介 2 1 数据传输模型 2 2 帧结构 2 3 波特率 03 STM32的USART 04 代码配置 01 USART的特点 USART是通用异步收发传输器 xff08 UniversalA
  • STM32串口开发之环形缓冲区

    01 简介 在之前的文章 stm32 串口详解 中 xff0c 我们讲解了串口的基本应用 xff0c 使用串口中断接收数据 xff0c 串口中断发送回包 xff08 一般可以使用非中断形式发送回包 xff0c 在数据接收不频繁的应用中 串口
  • 第六章 类域

    第六章 类域 一 类作用域 使用 访问全局变量 int x 61 1 namespace wd int x 61 20 class Test public Test int value x value void print int x co
  • 步进电机使用总结之噪声、振动的抑制

    不正确地驱动步进电机很容易导致电机发出 嗡嗡 的噪声和很大的振动 当驱动步进电机时 xff0c 如果发现步进电机处于静止状态时 xff0c 其内部都发出很明显的噪音 xff0c 有点类似线圈快速变化那种 xff0c 一般是由于线圈电流过大导
  • ADRC自抗扰控制学习

    入门 自抗扰控制01 xff1a 为何ADRC会成为百年PID算法的继承者 xff1f http news eeworld com cn mp ZLG a23516 jspx 自抗扰控制02 ADRC如何避免执行错误命令 http news
  • 关于串级PID控制的理解

    1 关于内环积分器 飞控里经常会用到串级PID控制 xff0c 通常设计方法为从内环到外环 xff0c 如速度环 位置环 内环通常为PD控制 xff0c 或P控制 xff0c 因为要保证一定带宽 xff0c 而积分器会抑制内环的带宽 xff
  • UMD代码格式

    span class token punctuation span span class token keyword function span span class token punctuation span root span cla
  • Tomcat Server.xml配置详解

    在理解Tomcat配置之前 xff0c 需要先熟悉一下Tomcat的架构 xff0c 便于更好的修改配置 一 Tomcat结构 server xff1a 即服务器 xff0c 每个tomcat程序启动后 xff0c 就是一个server s
  • Linux下U盘、SD卡挂载与卸载

    1 手动挂载 卸载 U盘 SD卡 对于ARM Linux来说 xff0c 第一次使用U盘或SD时 xff0c U盘这个文件目录是不能直接进入的 xff0c 我们需要对其进行挂载 xff0c 然后再接下来的使用中就可以直接进行使用了 通过再网
  • Java 阻塞队列--BlockingQueue

    1 什么是阻塞队列 xff1f 阻塞队列 xff08 BlockingQueue xff09 是一个支持两个附加操作的队列 这两个附加的操作是 xff1a 在队列为空时 xff0c 获取元素的线程会等待队列变为非空 当队列满时 xff0c
  • 大厂SQL经典面试题(二)留存问题

    留存率 是用户分析的核心指标之一 xff0c 留存问题也是一个经常考的题目 问题 现场写一道SQL 给定用户表Users 求出每个日期对应的活跃用户数 次日留存用户数 次日留存率 指标定义 某日活跃用户数 某日活跃的去重用户数 N日留存用户
  • 程序猿代码面试指南 PDF

    前言 今年是最难求职年 xff0c 我希望通过这篇文章能帮大家提高求职成功率 这篇文章分为简历篇 面试篇 谈薪酬篇 xff0c 包括了找工作过程中各个环节的技巧和防坑指南 这篇文章就是给大家分享左神这本 程序员代码面试指南 IT名企算法与数
  • 从 Java 代码逆向工程生成 UML 类图和序列图

    前言 本文面向于那些软件架构师 xff0c 设计师和开发人员 xff0c 他们想使用 IBM Rational Software Architect 从 Java 源代码来逆向工程生成 UML 类和序列图 逆向工程经常被用来从已有的源代码中
  • http的三次握手

    在http的三次握手当中 xff0c 首先客户端发起一个我要发送一个数据包的请求 xff0c 发送到服务端 xff0c 这里面呢会有一个标志SYN 61 1 Seq 61 X xff0c syn是一个标识 xff0c 就是我这是一个创建请求
  • SQL优化面试专题

    介绍 xff1a 无论您是创建Web应用程序的开发人员 xff0c 还是参与Web测试的DBA或测试人员 xff0c SQL方面的技巧在数据库编程和数据库验证中都非常重要 因此 xff0c 我们整理了QL性能优化方面的面试问题 SQL性能优
  • Docker容器:将带UI的程序直接转为Web应用,so easy

    摘要 xff1a 使用Docker容器 xff0c 将带UI的程序 xff0c 直接转换为Web应用 很方便 xff0c 跟大家分享一下 本文分享自华为云社区 使用Docker容器 xff0c 将带UI的程序 xff0c 直接转为Web应用
  • 38道多线程核心面试题(附答案)

    前言 今天给大家分享的是比较全面的多线程面试题 xff0c 大家在面试的过程中不免会被问到很多专业性的问题 xff0c 有的时候回答的并不是那么全面和精细 xff0c 这仅仅代表个人观点 1 如何预防死锁 xff1f 1 首先需要将死锁发生
  • Java程序员,最常用的20%技术有哪些?

    1 基本的数据结构和算法真的非常重要 xff1a 不管你做过多少项目或者是熟悉多少框架和工具 xff0c 面试和考察一个人还是大部分停留在基本功上 所以 xff0c 在每天工作开发之余 xff0c 应保证一定的时间段不断去打磨自己的基本功
  • Linux 程序编译过程详解

    大家肯定都知道计算机程序设计语言通常分为机器语言 汇编语言和高级语言三类 高级语言需要通过翻译成机器语言才能执行 xff0c 而翻译的方式分为两种 xff0c 一种是编译型 xff0c 另一种是解释型 xff0c 因此我们基本上将高级语言分

随机推荐

  • 关于485总线 A、B端上拉下拉电阻选择

    问 xff1a about rs485 用电阻上拉 B用电阻下拉 A B间用电阻连接 xff0c 这些电阻参数大致多少 xff1f 我们公司的设计是 TTL输入都用光偶隔离 输出加上拉和下拉 xff0c 中间加TVS和2个电阻串联 xff0
  • JAVA集合框架(一)-ARRAYLIST

    1 ArrayList的特点 存放的元素有序元素不唯一 可以重复 随机访问快插入删除元素慢非线程安全 2 底层实现 底层初始化 xff0c 使用一个Object类型的空对象数组 xff0c 初始长度为0 源码 Object类型对象数组引用
  • Java如何将两个数组合并为一个数组呢?

    数组 xff1a 数组 xff08 Array xff09 是有序的元素序列 1 若将有限个类型相同的变量的集合命名 xff0c 那么这个名称为数组名 组成数组的各个变量称为数组的分量 xff0c 也称为数组的元素 xff0c 有时也称为下
  • pca9548及vsc9548的设备树简单挂载

    简述 pca9548及vsc9548是iic拓展器件 xff0c 主要是防止iic器件地址冲突 通过写其0x0寄存器可切换0 7路iic 设备树挂载 这里用到了vsc9548 xff0c 且在第7路上挂在了eeprom器件 i2c 64 f
  • 类的作用域

    类的作用域简称类域 xff0c 它是指在类的定义中由一对花括号所括起来的部分 每一个类都具有该类的类域 xff0c 该类的成员局部于该类所属的类域中 在类的定义中可知 xff0c 类域中可以定义变量 xff0c 也可以定义函数 从这一点上看
  • 常见问题(持续更新)

    近期整理的初级开发遇到的问题 xff0c 希望对大家有用 1 Unsatisfied dependency expressed through field 39 baseMapper 39 于是在pom xml中搜索mybatis关键字 x
  • orb-slam中的orb特征

    1 ORB特征简介 ORB是Oriented FAST and Rotated BRIEF xff08 oFAST and rBRIEF xff09 的简称 xff0c ORB的名字已经说明了其来源 xff0c 其实ORB特征是采用FAST
  • 计算机组成原理 第二篇:总线 1.总线原理和意义

    总线是什么 总线是连接多个部件的信息传输线 是各部件共享的传输介质 总线可以传输的原理 总线实际上是由许多传输线或通路组成 每条线上保持的电平高低即是所传输的信号 每条线可一位一位地传输二进制代码 一串二进制代码可以在一段时间内逐一传输完成
  • 主流深度学习算法简介

    深度学习算法简介 1 深度学习主流算法包括 1 1 CNN 卷积神经网络 卷积神经网络 xff08 CNN xff09 是最常见的深度学习方法之 一 自20 世纪80 年代后期以来 xff0c CNN 已应用于视觉识别与分类任务 xff0c
  • 常见外贸英文术语(下)

    很多从事外贸行业的人都会用Skype IntBell AntTone等网络电话和客户沟通 xff0c 但是有时候会因为一些外贸行业的专业英文术语闹出笑话 今天就让我们来总结一些外贸常见英文术语 xff0c 让你和客户沟通更加顺畅 xff01
  • Phpstorm2018 使用破解补丁永久激活

    1 安装phpstorm xff0c 安装包请自行官网下载 http www jetbrains com phpstorm download 2 下载JetbrainsCrack jar文件 xff0c 存放至你的phpstorm执行文件同
  • va_start 与 va_end用法

    1 包含头文件 include lt stdarg h gt 2 使用方法 参考 http www cnblogs com hanyonglu archive 2011 05 07 2039916 html include lt stdio
  • jetson-sd卡制作(批量烧写)

    jetson系列如果使用sd卡开发 xff0c 开发完成后可以不用重新制作根文件系统 拷贝目前的SD卡即可实现批量烧写 一 开发好的SD卡制作img文件 1 将sd卡插到PC端 xff0c 查看sd卡设备 eg dev sdd fdisk
  • 结构体知识点

    结构体的结构如下 xff1a span class token comment 关键字struct是数据类型说明符 xff0c 指出下面说明的是结构体类型 span span class token keyword struct span
  • SurfaceView 的一般绘制View用法(一)

    前段时间写了不少关于自定义View相关的文章 xff0c 最近两个项目同时开工 xff0c 忙成狗了 xff0c 这不是不写博客的理由哈 xff0c 今晚写一篇关于SurfaceView相关的博客 xff0c 还是和以前一样 xff0c 今
  • WorkerMan实现Web通讯(使用Vue实现前端页面逻辑)

    需要使用到的扩展 https github com tangbc vue virtual scroll list 最终效果 对话框 主页面 Main vue lt template gt lt div gt lt chat message
  • [VS][原创]vs2019新建项目提示未正确加载nvdapackage包

    第一步 xff1a 确认cuda 43 cudnn以及驱动程序都安装了 第二步 xff1a 从win11菜单栏搜索打开Developer Command Prompt for VS 2019 xff0c 注意要以管理员身份运行 xff0c
  • 2016年linux c程序员和初学者不得错过的精品图书18册

    1 图书名称 零点起飞学Linux C编程 图书信息 陈冠军 清华大学出版社 2013 09 01 2 图书名称 Linux C从入门到精通 图书信息 明日科 清华大学出版社 2012 12 01 3 图书名称 Linux C编程一站式学习
  • 面试造飞机系列:看架构师如何设计微服务接口

    来源 后端技术学堂 责编 Carol 封图 CSDN下载于视觉中国 在微服务设计中 xff0c 服务间接口通信设计常见的有两种方式 xff1a RPC 和 REST xff0c 关于微服务和 RPC 的更多细节 xff0c 可以参考我上一篇
  • C++ 数组(vector)常用操作总结

    目录 1 vector对象的定义和初始化方式 2 vector 常用基础操作 3 使用迭代器的遍历 插入 删除操作 4 vector 元素的重排操作 xff08 排序 逆序等 xff09 5 vector 中找最值 6 改变vector大小