std::vector

2023-05-16

文章目录

  • 问题处理记录
    • std::vector查找指定元素C++
  • 概念
        • 优点
        • 缺点
        • 使用
    • vector声明和初始化
    • vector的基本操作
    • 二维向量
    • vector的begin() end() 和 front() back()的区别
    • 示例
    • 应用场景
  • C++中Vector.erase()删除某一元素的正确用法

问题处理记录

std::vector查找指定元素C++

https://blog.csdn.net/qq_43799400/article/details/122699509
https://blog.csdn.net/weixin_37120663/article/details/120696085


if (std::find(vector.begin(), vector.end(), item) != vector.end())
{
    //查到指定元素时的操作
}
else
{
    //未查到指定元素时的操作
}

概念

vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作多种数据结构算法的模板类和函数库。vector之所以被认为是一个容器,是因为它能够像容器一样存放各种类型的对象,简单地说,vector是一个能够存放任意类型的动态数组,能够增加和压缩数据。

vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。

优点

  1. 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组进行动态操作。通常体现在push_back() pop_back()
  2. 随机访问方便,即支持[ ]操作符和vector.at()
  3. 节省空间。

缺点

  1. 在内部进行插入删除操作效率低。
  2. 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。
  3. 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放。

使用

为了可以使用vector,必须在你的头文件中包含下面的代码:

#include <vector>

vector属于std命名域的,因此需要通过命名限定,如下完成你的代码:

using std::vector;//不建议使用using namespace std;直接引入std命名域

vector<int> vInts;
//或者连在一起,使用全名:
std::vector<int> vInts;

注意:
对最后元素操作最快(在后面添加删除最快 ), 此时一般不需要移动内存,只有保留内存不够时才需要
对中间和开始处进行添加删除元素操作需要移动内存,如果你的元素是结构或是类,那么移动的同时还会进行构造和析构操作,所以性能不高 (最好将结构或类的指针放入vector中,而不是结构或类本身,这样可以避免移动时的构造与析构)。


vector声明和初始化

vector 型变量的声明以及初始化的形式也有许多, 常用的有以下几种形式:

std::vector<ElemType> c;		//创建一个空的vector
std::vector<ElemType> c1(c2); 	//创建一个vector c1,并用c2去初始化c1
std::vector<ElemType> c(n) ; 	//创建一个含有n个ElemType类型数据的vector;
std::vector<ElemType> c(n,elem); //创建一个含有n个ElemType类型数据的vector,并全部初始化为elem;
//如:
std::vector<int> a ;            //声明一个int型向量a
std::vector<int> a(10) ;        //声明一个初始大小为10的向量
std::vector<int> a(10, 1) ;     //声明一个初始大小为10且初始值都为1的向量
std::vector<int> b(a) ;         //声明并用向量a初始化向量b
std::vector<int> b(a.begin(), a.begin()+3) ; //将a向量中从第0个到第2个(共3个)作为向量b的初始值

ElemType可以为基本的内置类型char,int,double,也可以为结构体/C++对象/string等。

除此之外, 还可以直接使用数组来初始化向量:

int n[] = {1, 2, 3, 4, 5};
std::vector<int> a(n, n+5) ;              //将数组n的前5个元素作为向量a的初值
std::vector<int> a(&n[1], &n[4]) ;        //将n[1] - n[4]范围内的元素作为向量a的初值

vector的基本操作

元素访问

std::vector<int> c;	
c.at(index);		//返回指定index位置处的元素,同时进行越界检查
operator[index]		//返回指定index位置处的元素,有越界风险
c.front();			//返回容器第一个元素
c.back();			//返回容器最后一个元素
c.date();			//返回指向内存中数组第一个元素的指针

迭代器

std::vector<int> c;	
c.begin();			//返回当前vector容器中起始元素的迭代器
c.end();			//返回指向容器最后一个数据单元的指针+1
c.rbegin();			//将vector反转后的开始指针返回(其实就是原来的end-1)
c.rend();			//将vector反转后的结束指针返回(其实就是原来的begin-1)
其他还有:cbegin,cend,crbegin,crend;
//应用
std::vector<int>::iterator it;
for (it = vec.begin(); it != vec.end(); it++) 
	cout << *it << endl;
//或者
for (size_t i = 0; i < vec.size(); i++) {
    cout << vec.at(i) << endl;
}

容量

c.empty();		//判断容器是否为空,若为空返回true,否则返回false
c.size();		//返回当前容器中实际存放元素的个数(比empty速度慢)
c.max_size();	//返回可容纳的最大元素数
c.reserve(num);	//改变当前vecotr所分配空间的大小,设置容器预留空间,但并不真正创建元素对象
c.capacity();	//当前vector分配的大小,linux下c.size()达到容器最大个数时,容器增长为原来的一倍1,2,4,8,16,32,64
c.shrink_to_fit()//通过释放未使用的内存减少内存的使用(C++11)

修改器

c.clear();			//清空当前的vector
c.push_back(elem);	//将元素添加到容器末尾 
c.pop_back();		//移除最后一个末尾元素
c.insert(); 		//插入元素,有多种使用方式
c.erase(); 			//移除元素,有多种使用方式
c.resize(num,defult);//改变容器中可存储元素的个数,并创建对象(default可省略)
c1.swap(c2);		//交换两个容器中的数据
示例:
c.insert(p,elem);	//在指针p指向的位置插入数据elem,返回指向elem位置的指针       
c.insert(p,n,elem);	//在位置p插入n个elem数据,无返回值
c.insert(p,begin,end);//在位置p插入在区间[begin,end)的数据,无返回值
c.erase(begin,end)    	删除begin,end区间的数据,返回指向下一个数据位置的指针(迭代器)

二维向量

与数组相同, 向量也可以增加维数, 例如声明一个m*n大小的二维向量方式可以像如下形式:

vector< vector<int> > b(10, vector<int>(5));        //创建一个10*5的int型二维向量

vector的begin() end() 和 front() back()的区别

https://blog.csdn.net/duan19920101/article/details/51679517/
https://www.cnblogs.com/xiaoyoucai/p/8283548.html

示例

示例一:

#include <iostream>
#include <vector>

using std::cout;
using std::endl;

int main()
{
	std::vector<int> v_queue;

	int a = 5, b = 8, result = 0;

	//在末尾添加元素
	v_queue.push_back( a );
	v_queue.push_back( b );

	//正向迭代器遍历
	for (std::vector<int>::iterator it = v_queue.begin(); it != v_queue.end(); ++it)
	{
		cout << *it << endl;
	}

	if(!v_queue.empty())//或 if(v_queue.size() > 0)
	{
		//获取第一个元素
		result = v_queue.front();
		cout << "result:" << result << endl;

		//移除首个元素
		v_queue.erase(v_queue.begin());
	}

	//反向迭代器遍历
	for (std::vector<int>::reverse_iterator it = v_queue.rbegin(); it != v_queue.rend(); ++it)
	{
		cout << *it << endl;
	}

	//非迭代器遍历
	for(int i = 0; i < v_queue.size(); i++ )//v.size() 表示vector存入元素的个数
 	{
    	cout << v_queue[ i ]; //把每个元素显示出来
 	}
 	return 0;
}

注意事项:

  1. 多线程操作时,需要添加线程锁对数据进行保护;
  2. 但凡使用了迭代器的循环体,都不要向迭代器所属的容器添加元素;

应用场景

参考资料:
https://www.cnblogs.com/zhonghuasong/p/5975979.html
https://www.cnblogs.com/skyfsm/p/6934246.html

C++中Vector.erase()删除某一元素的正确用法

https://blog.csdn.net/Sway_2012/article/details/7768040

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

std::vector 的相关文章

  • 如何将 unique_ptr 的向量声明为类数据成员?

    我想要一个 unique ptr 的向量作为我正在创建的类的成员 class Foo private vector
  • 从 std::type_info 检索数据类型的大小

    在C 03中 当您使用运算符时typeid http en cppreference com w cpp language typeid a 类型信息 http en cppreference com w cpp types type in
  • 用不均匀向量列表中的正值替换正表值

    背景 我最近问这个问题 https stackoverflow com questions 72899527 replacing a subset of table values with a list of vectors 然而 我使示例
  • 清空用户定义类内的 std::vector 时未释放内存

    当我们遇到一些内存问题时std vector是一个类的一个字段 我们用大量数据填充这个向量 在程序的某个点需要释放这些数据 然而 即使向量容量为零 内存也没有被释放或完全释放 这里您有我们程序的简化版本 正如你所看到的 类Foo只有一个字段
  • STL容器的范围插入函数在c ++ 11下返回void?

    刚刚学习c 所以我可能没有正确理解这一点 但我只读到范围插入函数在新标准下返回一个迭代器 C Primer 5th Ed cplusplus com http www cplusplus com reference string basic
  • 以与轴的纵横比一致的物理单位重新缩放箭袋箭头

    过去几个小时我一直在尝试定制matplotlib quiver没有太多运气 该文档非常混乱 我无法解析如何设置每个参数 在我的坐标轴中 一个垂直像素的物理距离比一个水平像素的物理距离小得多 并且我希望 quiver 将箭头自动缩放到此纵横比
  • 在 C++ 中检查向量的所有元素是否相等

    如果我有一个值向量并且想要检查它们是否都相同 那么在 C 中有效执行此操作的最佳方法是什么 如果我用其他语言 例如 R 进行编程 我的想法是仅返回容器的唯一元素 然后如果唯一元素的长度大于 1 我知道所有元素不可能相同 在 C 中 可以这样
  • 我需要关闭 std::fstream 吗? [复制]

    这个问题在这里已经有答案了 可能的重复 我需要手动关闭 ifstream 吗 https stackoverflow com questions 748014 do i need to manually close a ifstream 我
  • 大数组的堆栈溢出,但同样大的向量的堆栈溢出?

    今天我在处理大型数据结构时遇到了一个有趣的问题 我最初使用向量来存储超过 1000000 个整数 但后来决定我实际上并不需要向量的动态功能 无论如何 我在声明后就保留了 1000000 个位置 相反 这将是有益的 能够在数据结构中的任何位置
  • 具有通用向量和对类型的对向量,模板的模板

    我想将一个成对的向量传递给一个函数 实际的向量实现以及对的类型应该是模板参数 我想到了这样的事情 template
  • 如何找到一个向量中与另一个向量最接近的值?

    我有两个大小相等的向量 例如 A 2 29 2 56 2 77 2 90 2 05 and B 2 34 2 62 2 67 2 44 2 52 我有兴趣在两个相同大小的向量 A 和 B 中找到最接近的值 几乎相等 即在 A 中的所有元素中
  • 将函数应用于滚动窗口

    假设我有一个很长的清单A我想要计算的值 例如长度 1000 std100 对 即我想计算std A 1 100 std A 2 101 std A 3 102 std A 901 1000 在 Excel VBA 中 可以通过编写例如以下内
  • 如何确保 Data.Vector 的摊销 O(n) 级联?

    我有一个应用程序 在其中使用向量作为代码的一部分是有效的 然而 在计算过程中我需要跟踪一些元素 我听说你可以从 Data Vectors 获得 O n 摊销串联 通过通常的数组增长技巧 但我认为我做得不对 假设我们有以下设置 import
  • 从 r 矩阵的每一行中减去一个常数向量

    我有一个 5 列 4 行的矩阵 我还有一个 3 列的向量 我想分别从矩阵每一行的第 3 4 和 5 列减去向量中的值 b lt matrix rep 1 20 nrow 4 ncol 5 1 2 3 4 5 1 1 5 9 13 17 2
  • Xcode 找不到 cstddef

    由于某种原因 Xcode iOS 无法找到我正在使用的库 Boost 的 cstddef 有谁知道如何解决这一问题 我正在 Mac OS X 10 8 下使用 Xcode 4 6 进行编译 你应该让你的项目全部为 Objective C 将
  • 如何在 C++ 中前向声明 std::set?

    为了加快编译过程 我正在尝试简化我的头文件MyClass hpp通过前向声明 STL 容器 例如 std vector std set But std set can NOT在以下代码中进行前向声明 同时std vector can be
  • 目标加速度和子弹减速度随角度变化的弹丸目标预测

    我之前问过一个关于这个话题的问题here https gamedev stackexchange com questions 200260 intercept an accelerating object with a constant v
  • SVG/矢量图室内导航路由

    我一直在网上搜索有关如何为基于 SVG 的室内平面图实现我自己的点对点导航系统的教程或方法 我已经在网上搜索过 但唯一的选项适用于谷歌地图 不过 我使用 Illustrator 创建了地图 并使用路径 矢量作为 SVG 图像 我不需要为用户
  • 如何让 SWIG 在包装包含向量的模板类时应用模板?

    我正在尝试使用 SWIG 来包装 在 C 中 一些 C 代码 该代码包含一个模板类 该模板类本身包装了std vector
  • 确定 std::istream 长度的更好方法?

    有没有比以下更好的方法来确定 std istream 的长度 std istream pcStream GetSomeStream pcStream gt seekg 0 ios end unsigned int uiLength pcSt

随机推荐

  • 飞控pixhawk硬件框架

    本文转载于 xff1a https blog csdn net csshuke article details 78952026 xfeff xfeff 1 Phxhawk连接线路 2 Phxhawk硬件芯片列表 处理器 STM32F427
  • PCB_layout_misc

    AD的规则设置参考 https blog csdn net geek monkey article details 80249217 一些PCB厂家的工艺 嘉立创https www jlc com portal vtechnology ht
  • 怎样把经纬度坐标转换为空间直角坐标

    怎样把经纬度坐标转换为空间直角坐标 假设你的空间直角坐标以地球球心为原点 原点到北极为正z轴 原点到经纬度 0 0 为正x轴 那么纬度a 北正南负 经度b 东正西负 的空间直角坐标为 x 61 Rcos a cos b y 61 Rcos
  • APM添加参数

    APM添加参数 参考 https ardupilot org dev docs code overview adding a new parameter html 添加应用参数模块 例如 battery Parameters h k par
  • pixhawk6x/5x 电源插座/插头的型号

    型号 xff1a molex CLIK Mate 5024430670 5024390600
  • intellij idea: git tag操作 及 master branch相互合并操作

    git tag和git branches区别 xff1f tag就像是里程碑标志的一个点 branch是一个新的征程的一条线 tag是静态的 是只读的 不能修改 而branch是要往前走的 稳定版本备份用tag 新功能开发多人用branch
  • C++之STL和Boost

    最近一年我电话面试了数十位 C 43 43 应聘者 xff0c 惯用的暖场问题是 工作中使用过 STL 的哪些组件 xff1f 使用过 Boost 的哪些组件 xff1f 得到的答案大多集中在 vector map 和 shared ptr
  • ubuntu 下安装intel realsense驱动

    在安装之前一定要确保系统是ubuntu 14 04 3 64位 xff01 在安装之前一定要确保系统是ubuntu 14 04 3 64位 xff01 在安装之前一定要确保系统是ubuntu 14 04 3 64位 xff01 重要的事情说
  • windows下安装numpy,scipy遇到的问题总结

    最近开始研究3D手势识别 xff0c 下载的源码包是基于python的 xff0c 需要用到扩展包numpy scipy等 xff0c 安装过程汇总遇到的问题总结如下 xff1a 1 安装numpy 下载numpy编译包 xff0c 进入该
  • Linux大数据处理踩坑实录

    最近开发需要在linux服务器上做大数据处理 xff0c 由于对Linux开发并不是很熟悉 xff0c 因此踩了很多坑 xff0c 先作如下记录 xff1a 1 bash shell实现多进程 背景如下 需要从hadoop的hdfs上向服务
  • Deep Compression阅读理解及Caffe源码修改

    更新 xff1a 没想到这篇文章写出后有这么多人关注和索要源码 xff0c 有点受宠若惊 说来惭愧 xff0c 这个工作当时做的很粗糙 xff0c 源码修改的比较乱 xff0c 所以一直不太好拿出手 最近终于有时间整理了一下代码并开源出来了
  • Tensorflow 离线安装跳坑总结

    TensorFlow作为目前最被看好的深度学习开源框架 xff0c 又顶着Google爸爸的光环 xff0c 使得很多CNN网络的部署都基于此框架 最近开始研究GAN xff08 生成对抗网络 xff09 xff0c 鉴于大部分源码都基于T
  • ARM NEON常用函数总结

    NEON 技术是 ARM Cortex A 系列处理器的 128 位 SIMD xff08 单指令 xff0c 多数据 xff09 架构扩展 xff0c 旨在为消费性多媒体应用程序提供灵活 强大的加速功能 xff0c 从而显著改善用户体验
  • TensorRT cuda8.0 cudnn 7.0.5 tar包安装

    总体步骤参考这篇文章 https zhuanlan zhihu com p 35468450 1 准备环境 TensorRT 依赖cuda和cudnn xff0c 且根据下载的TensorRT版本 xff0c 需要严格保证cuda和cudn
  • caffe模型TensorRT部署实践(一)

    参考代码 TensorRT安装包下的samples sampleMNIST sampleMNIST cpp 1 设置使用的gpu id xff0c 如果不设置 xff0c 默认使用第0块 cudaSetDevice 3 set device
  • Ubuntu关于串口的操作(查看串口信息、串口助手、串口权限)

    一 查看本机串口信息 1 串口是否在使用 串口在 dev 目录中 xff0c 查看串口是否在使用 xff0c 可以用命令 ls l dev ttyUSB0 说明 xff1a ls l xff1a 是查看目录的命令 xff0c 直接用ls或l
  • 基于caffe的量化模型训练与部署——训练篇

    为什么需要量化 xff1f 我们知道 xff0c cnn网络的前向计算瓶颈主要集中在卷积层 xff0c 而卷积层的实质是大量的浮点数相乘 相加等运算操作 xff0c 大量的浮点数计算限制了模型在低处理器或移动端等设备中的部署 如果能将浮点运
  • get/post简单请求示例

    安装了django后使用django admin startproject demoapi创建django项目 xff0c cd demopai进入项目目录内 xff0c 创建apppython manage py startapp api
  • 什么是请求报文和响应报文?

    在了解请求报文和响应报文之前 咱们先了解下什么是HTTP协议 http协议 网络传输协议 协议 规定网络数据传输格式 http协议组成 请求报文 43 响应报文 浏览器发请求 必须是 xff1a 请求报文 服务器响应 必须是 xff1a 响
  • std::vector

    文章目录 问题处理记录std vector查找指定元素C 43 43 概念优点缺点使用 vector声明和初始化vector的基本操作二维向量vector的begin end 和 front back 的区别示例应用场景 C 43 43 中