C++ vector的用法总结(整理)

2023-05-16

vector 是向量类型,它可以容纳许多类型的数据,如若干个整数,所以称其为容器。它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的。

vector 是C++ STL的一个重要成员,使用它时需要包含头文件: #include<vector>

构造函数 语法: 

  vector();
  vector( size_type num, const TYPE &val );
  vector( const vector &from );
  vector( input_iterator start, input_iterator end );

变量声明:

    1 例:声明一个int向量以替代一维的数组:vector <int> a;(等于声明了一个int数组a[],大小没有指定,可以动态的向里面添加删除)。

    2 例:用vector代替二维数组.其实只要声明一个一维数组向量即可,而一个数组的名字其实代表的是它的首地址,所以只要声明一个地址的向量即可,即:vector <int *> a 或者 vector<vector<int>> vec。同理想用向量代替三维数组也是一样,vector <int**>a;再往上面依此类推.

具体的用法以及函数调用:

vector<int> a;           //无参数 - 构造一个空的vector,
vector<int> a(10);       //定义了10个整型元素的向量(尖括号中为元素类型名,它可以是任何合法的数据类型),但没有给出初值,其值是不确定的。
vector<int> a(10,1);     //定义了10个整型元素的向量,且给出每个元素的初值为1
vector<int> a(b);        //用b向量来创建a向量,整体复制性赋值, 拷贝构造
vector<int> v3=a ;       //移动构造
vector<int> a(b.begin(),b.begin+3);   //定义了a值为b中第0个到第2个(共3个)元素
int b[7]={1,2,3,4,5,9,8};
vector<int> a(b,b+6);    //从数组中获得初值,b[0]~b[5]

vector对象的几个重要操作,举例说明如下:

    (1)a.assign(b.begin(), b.begin()+3); //b为向量,将b的0~2个元素构成的向量赋给a
    (2)a.assign(4,2);        //是a只含4个元素,且每个元素为2
    (3)a.back();             //返回a的最后一个元素
    (4)a.front();            //返回a的第一个元素
    (5)a[i];                 //返回a的第i个元素,当且仅当a[i]存在2013-12-07
    (6)a.clear();            //清空a中的元素
    (7)a.empty();            //判断a是否为空,空则返回ture,不空则返回false
    (8)a.pop_back();         //删除a向量的最后一个元素
    (9)a.erase(a.begin()+1, a.begin()+3);  //删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)
    (10)a.push_back(5);      //在a的最后一个向量后插入一个元素,其值为5
    (11)a.insert(a.begin()+1, 5);         //在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
    (12)a.insert(a.begin()+1, 3,5);       //在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
    (13)a.insert(a.begin()+1,b+3, b+6);   //b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8
    (14)a.size();            //返回a中元素的个数;
    (15)a.capacity();        //返回a在内存中总共可以容纳的元素个数
    (16)a.resize(10);        //将a的现有元素个数调至10个,多则删,少则补,其值随机
    (17)a.resize(10, 2);      //将a的现有元素个数调至10个,多则删,少则补,其值为2
    (18)a.reserve(100);      //将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能) 
    (19)a.swap(b);           //b为向量,将a中的元素和b中的元素进行整体性交换
    (20)a.begin();           // 返回指向容器第一个元素的迭代器
    (21)a.end();             // 返回指向容器最后一个元素的迭代器
    (22)a==b;                //b为向量,向量的比较操作还有!=,>=,<=,>,<
(1)sort(a.begin(),a.end());     //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素进行从小到大排列
(2)reverse(a.begin(),a.end()); //对a中的从a.begin()(包括它)到a.end()(不包括它)的元素倒置,但不排列,如a中元素为1,3,2,4,倒置后为4,2,3,1
(3)copy(a.begin(),a.end(),b.begin()+1); //把a中的从a.begin()(包括它)到a.end()(不包括它)的元素复制到b中,从b.begin()+1的位置(包括它)开        始复制,覆盖掉原有元素
(4)find(a.begin(),a.end(),10); //在a中的从a.begin()(包括它)到a.end()(不包括它)的元素中查找10,若存在返回其在向量中的位置

错误的操作:

//这种做法以及类似的做法都是错误的。刚开始我也犯过这种错误,后来发现,下标只能用于获取已存在的元素,而现在的a[i]还是空的对象

vector<int> a;
for(int i=0;i<10;i++)
    a[i]=i;

C++11 关与vector的新增特性:

c++11 对vector的扩展主要有:

a.cbegin();    // 返回指向容器中第一个元素的const_iterator
a.cend();      // 返回指向容器中最后一个元素的const_iterator
a.crbegin();   // 反转迭代器, 返回指向容器中最后一个元素的const_iterator
a.crend();     // 反转迭代器, 返回指向容器中第一个元素的const_iterator
a.emplace();   // 相对于insert功能,但比它更有效率
a.emplace_back(); //相对于push_back, 但比它更有效率

emplace_back能通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好地避免内存的拷贝与移动,使容器插入元素的性能得到进一步提升。 
  由此,在大多数情况下应该优先使用emplace_back来代替push_back。

例子:

#include <iostream>
#include <vector>

int main ()
{
  std::vector<int> myvector = {10,20,42,33,50};

  std::cout << "myvector contains:";

    // test cbegin,cend
  for (auto it = myvector.cbegin(); it != myvector.cend(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

    // test crbegin, crend
  for (auto it = myvector.crbegin(); it != myvector.crend(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}
Output:
myvector contains: 10 20 42 33 50
50 33 42 20 10

emplace和emplace_back例子:

#include <iostream>
#include <vector>

// reference: http://www.cplusplus.com/reference/vector/vector/emplace_back/
int test_emplace_1()
{
	/*
		template <class... Args>
		void emplace_back (Args&&... args);
	*/
	std::vector<int> myvector = { 10, 20, 30 };
 
	myvector.emplace_back(100);
	myvector.emplace_back(200);
 
	std::cout << "myvector contains:";
	for (auto& x : myvector)
		std::cout << ' ' << x;
	std::cout << '\n';
	// output 10 20 30 100 200
}

int test_emplace_2()
{
		
	/*
		template <class... Args>
		iterator emplace (const_iterator position, Args&&... args);
	*/
	std::vector<int> myvector = { 10, 20, 30 };
     
    // return an iterator that points to the newly emplaced element. 
	auto it = myvector.emplace(myvector.begin(), 100);
	myvector.emplace(it, 200);
	myvector.emplace(myvector.end(), 300);
 
	std::cout << "myvector contains:";
	for (auto& x : myvector)
		std::cout << ' ' << x;
	std::cout << '\n'; 
    // output: 10 200 100 20 30 300
}

int main(void)
{
	test_emplace_1();
	test_emplace_2();
	
	return 0;
}

https://blog.csdn.net/imJaron/article/details/77975370

 

 

 

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

C++ vector的用法总结(整理) 的相关文章

  • VS2010 断点失效解决方案 (VC)

    遇到几次断点失效的问题 xff0c 下面的方法都用了一下 xff0c 不清楚是哪个方法起作用了 一 菜单 调试 选项和设置 调试 常规 要求源文件与原始版本完全匹配 取消这个功能 二 菜单 编辑 高级 设置选定内容的格式 把打不上断点的那个
  • stm32学习

    波特率 xff1a 每秒传送的位数 DMA Direct Memory Access xff0c 直接内存存取 是所有现代电脑的重要特色 xff0c 它允许不同速度的硬件装置来沟通 xff0c 而不需要依赖于 CPU 的大量中断负载 否则
  • 经纬高坐标系转到东北天坐标系

    经纬高坐标系转到东北天坐标系 基本思路 xff1a 首先把经纬高 xff08 大地坐标系 lla llh xff09 转到直角坐标系 xff08 地心地固直角坐标系 xff08 ECEF xff09 xyz xff09 然后再转为局部坐标系
  • Ubuntu20.04 配置D435i相机

    文章目录 一 安装使用 InterRealSenseD435i SDK21 注册服务器的公钥2 安装3 安装开发者和调试包4 测试SDK2 二 安装realsense ros1 创建工作空间2 源码安装3 编译 xff1a 三 安装kali
  • java打卡-day3 变量和数据类型

    变量和数据类型 基本数据类型分类 4类8种 整数型 byte 占一个字节 128到127short 占两个字 215 215 1int 占四个字节 231 231 1long 占八个字节 263 263 1 浮点型float 占四个字节 3
  • 【行人惯性导航】关于行人导航中IMU位姿推导的知识点及相关代码

    IMU姿态惯性推导 本文是我上学期间写得 xff0c 之前已经在另一个博客发布过 xff0c 如今转至此发布 最近从事行人惯性导航的研究 xff0c 本人也是一个小白 xff0c 其中看了很多文献 xff0c 有很多个人思考很费时间的地方
  • nuttx操作系统的移植以及下载

    1 在ubuntu根目录下 xff1a root 64 ubuntu apt get update 更新包 2 root 64 ubuntu apt get install gcc arm none eabi 编译器 3 kconfig f
  • MPI集群环境搭建

    我在前面两篇博客中简要介绍了为什么要并行计算以及MPI的一些学习心得 xff0c 接下来我们正式开始MPI的学习之路 我们知道MPI是分布式内存编程 xff0c 所以这篇博客会详细讲解MPI集群环境的搭建过程 一 准备工作 选择Linux版
  • python 练习 tcp 服务器与客户端发、接信息,pycharm

    背景 win8 1 pycharm 2021 3 1 python 3 9 7 自带idle vs code 1 64 2 现象 1 代码不知道如何在idle 和 vs code中运行 xff0c 总是在运行客户端代码后 已先运行服务器代码
  • VSCode配置终端为cmd命令行程序的操作步骤

    步骤1 xff1a 依次点击菜单栏的 终端 新建终端 步骤2 xff1a 按图中红色箭头的方向和方框所示 xff0c 依次点击 步骤3 xff1a 点击图中红框处的command product xff0c 下次再启动时的VSCode终端就
  • VC/C++ 发送post请求

    前面我搭建了一个servlet xff0c 响应get post请求 xff0c 网页端已经实现get post请求 xff0c 这个时候我用c 43 43 编辑的程序也想发送post请求 xff0c 于是 xff0c 有了下面这段代码 s
  • Python subprocess模块解析

    在学习这个模块前 xff0c 我们先用Python的help 函数查看一下subprocess模块是干嘛的 xff1a DESCRIPTION This span class hljs keyword module span allows
  • Java与C/C++的性能对比

    写这个主题是因为若干时间前一时头脑发热 xff0c 写了这个帖子 xff08 http www iteye com topic 857722 xff09 xff0c 现在看来这个帖子很幼稚 xff0c 尤其是二楼 61 61 xff0c 后
  • char数组与char指针的区别与联系

    字符串 xff08 char xff09 与字符数组 xff08 char 区别 在C语言中 xff0c 对字符串的操作主要有两种方式 xff1a 一是字符数组 char xff0c 二是使用字符指针 char 接下来最这两种所使用的情况做
  • Ubuntu系统火狐浏览器无法上网方案解决

    在国内google浏览器无法直接使用 xff0c 我们安装ubuntu系统自带的火狐浏览器在设置中选择的事google上网 xff0c 所有大家网络连接没问题 xff0c 就是无法上网 解决问题如下 xff1a 第一种 xff1a 重新安装
  • 解决ROS常遇到的Couldn’t find executable named报错解决

    解决办法 xff1a 将执行文件打开权限允许作为程序执行文件
  • ROS学习(一)ROS Noetic安装及环境配置

    文章目录 前言0 ROS Installation Options1 Installation1 1 Configure your Ubuntu repositories1 2 Setup your sources list1 3 Set
  • 嵌入式Linux 时间同步 gpsd+chrony

    嵌入式Linux 时间同步 gpsd 43 chrony 嵌入式Linux系统 xff0c 外接GPS设备 xff0c 系统通过NMEA数据和pps进行时间同步 xff0c 同时将本系统作为时间同步服务器 一 基本原理 NMEA中获取UTC
  • ModbusRTU串口读写报文解析

    0 MODBUS速览 Modbus是一种通信协议 xff0c ModubsRTU是它的一种传输模式 xff0c 通过这个协议能实现串口数据通讯 可以用C 控件读写串口 xff0c 也可以直接使用开源的串口助手 为了简化问题 xff0c 本文
  • Types of daTabases数据库类型

    NoSQL databases provide the performance scalability and stability that s required by the modern data driven apps we inte

随机推荐

  • jeston TX1_TX2 ubuntu18.04安装(国内安装源gitee)ROS Melodic

    查看ubunut系统信息 cat proc version uname a lsb release a 我自己的系统信息是 xff1a 由于我自己已经迁移了系统至SD卡 xff0c 所以存储比较富裕 xff1a 通过对应的ubuntu版本安
  • 9 个将改变一切的物联网应用

    无论您是有远见的 CEO 技术驱动型 CEO 还是 IT 领导者 xff0c 您之前都遇到过 IoT 一词 它经常与最高级一起使用 xff0c 表示它将如何彻底改变您的工作 娱乐和生活方式 但这只是另一个流行语 xff0c 还是承诺的技术圣
  • Android aplog是什么?

    aplog 是系统应用层的log xff0c 比如应用程序无响应或强行关闭 xff0c kernel相关的 xff0c 比如driver xff08 相机 蓝牙 usb 启动 xff09 出了开机问题 手机对服务唤醒和休眠的一些记录蓝牙相关
  • android 7.0 加入 android:directBootAware

    Android N引入了一个新特性 xff1a Direct Boot Mode 设备启动后进入的一个新模式 xff0c 直到用户解锁 xff08 unlock xff09 设备此阶段结束 在此 Direct Boot Mode 下 APP
  • Kotlin概述与Java的比较

    Kotlin是JetBrains的一种新的编程语言 它首次出现在2011年 xff0c JetBrains推出了名为 科特林 的项目 Kotlin是开源语言 基本上像Java一样 xff0c C和C 43 43 Kotlin也是 静态类型编
  • armlink 用法详解

    映像文件 image xff1a 是指一个可执行文件 xff0c 在执行的时候被加载到处理器中 一个映像文件有多个线程 它是ELF Executable and linking format 格式的 段 Section xff1a 描述映像
  • 人工智能的五大核心技术

    计算机视觉 机器学习 自然语言处理 机器人和语音识别是人工智能的五大核心技术 xff0c 它们均会成为独立的子产业 计算机视觉 计算机视觉是指计算机从图像中识别出物体 场景和活动的能力 计算机视觉技术运用由图像处理操作及其他技术所组成的序列
  • ubuntu下文件拷贝命令cp命令

    该命令的功能是将给出的文件或目录拷贝到另一文件或目录中 xff0c 就如同DOS下的copy命令一样 xff0c 功能非常强大 语法 xff1a cp xff3b 选项 xff3d 源文件或目录 目标文件或目录 说明 xff1a 该命令把指
  • android camera 照相机/摄像机

    一 camera启动 1 一个activity启动调用流程 xff1a onCreate gt onStart gt onResume onCreate xff1a 1 可添加所需布局文件 xff0c 画界面 2 开启线程 xff0c 启动
  • 正确学习javascript。困惑的指南

    正确学习 javascript 困惑的指南 迷失了 javascript xff1f 这一点都不奇怪 你需要一个能告诉你真正重要的指南 我们只有一个 向左看 有一个框架市场 xff0c 它们相互竞争 xff0c 赞扬它们的能力 向右看 这是
  • 【ROS学习2】创建ROS工作空间及功能包

    目录 创建ROS工作空间及功能包工作空间 workspace src 代码空间 Source Space build 编译空间 Build Space devel 开发空间 Development Space install 安装空间 In
  • 【GStreamer 】5-5-总结USB相机转RTSP网络视频流-推流usb摄像头JPEG

    我们使用gstreamer rtsp server xff0c 实现了USB相机转RTSP网络流的基本功能 xff0c 之前很多篇都讲了如何实现 xff0c 这一次我们集中精力解决之前的一些问题 文章 GStreamer 5 4 USB相机
  • C程序设计语言 5-3

    练习5 3 用指针方式实现第2章中的函数strcat 函数strcat s t 将t指向的字符串复制到s指向的字符串的尾部 include lt stdio h gt int my strcat char char int main cha
  • NuttX 文件系统架构介绍(7.14)

  • 谈谈memcpy函数的优化(纯C)

    在使用C语言编程时 xff0c 我们常用memcpy来复制内存数据 xff0c 但很少有人会关注到memcpy怎么实现 最简单的memcpy功能实现如下 xff1a void low memcpy void dst const void s
  • USB DEVICE调试心得

    一 USB设备链接后无法HUB不上报发现新设备 USB控制器未打开 xff0c USB DP DM引脚配置不正确 二 能够发现设备 xff0c 但HOST端提示获取描述符失败 获取描述符是 USB DEVICE 链接后 HOST 向 DEV
  • PX4uORB介绍[4]-对象和数据结构

  • ubuntu禁止显示器休眠的方法

    近期在firefly RK3399开发板上调试代码 xff0c 经常遇到显示器自动休眠 xff0c 并且发现每次休眠都对系统实时性产生一些影响 xff0c 最终在万能的CSDN博客上找到解决办法 xff1a Linux不让显示器休眠的方法
  • STM32F4 SPI RX/TX DMA 读写FLASH数据

    STM32 使用DMA读写FLASH数据需要注意以下几点 xff1a 1 SPI全双工模式下 xff0c 无论读写FLASH数据均需要同时使能RX TX DMA 2 写数据时回读数据应当丢弃 xff0c 读数据时应当发送0xff来启动SPI
  • C++ vector的用法总结(整理)

    vector 是向量类型 xff0c 它可以容纳许多类型的数据 xff0c 如若干个整数 xff0c 所以称其为容器 它相当于一个动态的数组 当程序员无法知道自己需要的数组的规模多大时 用其来解决问题可以达到最大节约空间的目的 vector