【C++】 Vector

在这里插入图片描述

文章目录

  • 1 背景
  • 2 什么是 vector?
  • 3 vector 特性
  • 4 基本函数实现
  • 5 基本用法
  • 6 例子
    • 在 vector 最后移除和插入数据
    • clear() 清除 vector 中所有数据
    • 排序
    • 访问(直接数组访问&迭代器访问)
    • 二维数组两种定义方法
  • 7、参考

1 背景

C++ 中的容器(Containers)是一种非常重要的特性,它们提供了存储数据项的方式,并且允许以不同的方式访问这些数据项。容器提供了对数据的封装、抽象和通用的访问接口,使得数据的管理和操作更加简单和高效。C++ 标准库提供了一系列容器,包括序列容器关联容器两大类。

一、序列容器(Sequential Containers)

序列容器中的元素按照插入的顺序进行存储。主要的序列容器有:

  • vector:动态数组,可以随机访问元素,支持在容器尾部快速插入和删除元素,但在容器开头或中间插入或删除元素时效率较低。
  • deque(双端队列):支持在容器两端快速插入和删除元素,但随机访问元素的速度比 vector 稍慢。
  • list:双向链表,支持在任何位置快速插入和删除元素,但不支持随机访问。
  • forward_list(C++11 引入):单向链表,与 list 类似,但只支持向前遍历,不支持反向遍历,插入和删除操作也较快。
  • string:虽然不是严格意义上的容器,但提供了类似容器的接口来存储和操作字符序列。
  • array(C++11 引入):固定大小的数组,支持随机访问,但不支持动态改变大小。

二、关联容器(Associative Containers)

关联容器中的元素按照特定的键(key)来组织,以便快速检索。主要的关联容器有:

  • set:基于红黑树实现,包含唯一元素的集合,不允许有重复元素。支持基于键的快速查找、插入和删除操作。
  • multiset:与 set 类似,但允许存储重复元素。
  • map:存储键值对(key-value pairs),每个键都映射到一个唯一的值。键是唯一的,但值可以重复。支持基于键的快速查找、插入和删除操作。
  • multimap:与 map 类似,但允许多个键映射到相同的值。
  • unordered_set(C++11 引入):基于哈希表实现,提供平均常数时间复杂度的查找、插入和删除操作。不包含重复元素。
  • unordered_multiset(C++11 引入):与 unordered_set 类似,但允许存储重复元素。
  • unordered_map(C++11 引入):存储键值对,基于哈希表实现,提供平均常数时间复杂度的查找、插入和删除操作。键是唯一的,但值可以重复。
  • unordered_multimap(C++11 引入):与 unordered_map 类似,但允许多个键映射到相同的值。

在选择容器时,应根据数据的特性(是否需要随机访问、是否需要保持元素的顺序、是否需要快速查找等)以及操作的类型(插入、删除、查找等)来决定使用哪种容器。正确选择容器类型可以显著提高程序的性能和效率。

2 什么是 vector?

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。

3 vector 特性

1.顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。

2.动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。提供了在序列末尾相对快速地添加/删除元素的操作。

3.能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。

4 基本函数实现

1.构造函数

  • vector():创建一个空vector
  • vector(int nSize):创建一个vector,元素个数为nSize
  • vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
  • vector(const vector&):复制构造函数
  • vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中

2.增加函数

  • void push_back(const T& x):向量尾部增加一个元素X
  • iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
  • iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
  • iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据

3.删除函数

  • iterator erase(iterator it):删除向量中迭代器指向元素
  • iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
  • void pop_back():删除向量中最后一个元素
  • void clear():清空向量中所有元素

4.遍历函数

  • reference at(int pos):返回pos位置元素的引用
  • reference front():返回首元素的引用
  • reference back():返回尾元素的引用
  • iterator begin():返回向量头指针,指向第一个元素
  • iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
  • reverse_iterator rbegin():反向迭代器,指向最后一个元素
  • reverse_iterator rend():反向迭代器,指向第一个元素之前的位置

5.判断函数

  • bool empty() const:判断向量是否为空,若为空,则向量中无元素

6.大小函数

  • int size() const:返回向量中元素的个数
  • int capacity() const:返回当前向量所能容纳的最大元素值
  • int max_size() const:返回最大可允许的vector元素数量值

7.其他函数

  • void swap(vector&):交换两个同类型向量的数据
  • void assign(int n,const T& x):设置向量中前n个元素的值为x
  • void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素

8.看着清楚

1.push_back 在数组的最后添加一个数据
2.pop_back 去掉数组的最后一个数据
3.at 得到编号位置的数据
4.begin 得到数组头的指针
5.end 得到数组的最后一个单元+1的指针
6.front 得到数组头的引用
7.back 得到数组的最后一个单元的引用
8.max_size 得到vector最大可以是多大
9.capacity 当前vector分配的大小
10.size 当前使用数据的大小
11.resize 改变当前使用数据的大小,如果它比当前使用的大,者填充默认值
12.reserve 改变当前vecotr所分配空间的大小
13.erase 删除指针指向的数据项
14.clear 清空当前的vector
15.rbegin 将vector反转后的开始指针返回(其实就是原来的end-1)
16.rend 将vector反转构的结束指针返回(其实就是原来的begin-1)
17.empty 判断vector是否为空
18.swap 与另一个vector交换数据

5 基本用法

#include < vector> 
using namespace std;

6 例子

在 vector 最后移除和插入数据

#include <string.h>
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int>obj;//创建一个向量存储容器 intfor(int i=0;i<10;i++) // push_back(elem)在数组最后添加数据 {obj.push_back(i);cout<<obj[i]<<",";    }for(int i=0;i<5;i++)//去掉数组最后一个数据 {obj.pop_back();}cout<<"\n"<<endl;for(int i=0;i<obj.size();i++)//size()容器中实际数据个数 {cout<<obj[i]<<",";}return 0;
}

output

0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,

clear() 清除 vector 中所有数据

#include <string.h>
#include <vector>
#include <iostream>
using namespace std;int main()
{vector<int>obj;for(int i=0;i<10;i++)//push_back(elem)在数组最后添加数据 {obj.push_back(i);cout<<obj[i]<<",";}obj.clear();//清除容器中所以数据for(int i=0;i<obj.size();i++){cout<<obj[i]<<endl;}return 0;
}

output

0,1,2,3,4,5,6,7,8,9,

排序

#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;int main()
{vector<int>obj;obj.push_back(1);obj.push_back(3);obj.push_back(0);sort(obj.begin(),obj.end());//从小到大cout<<"从小到大:"<<endl;for(int i=0;i<obj.size();i++){cout<<obj[i]<<",";  } cout<<"\n"<<endl;cout<<"从大到小:"<<endl;reverse(obj.begin(),obj.end());//从大到小 for(int i=0;i<obj.size();i++){cout<<obj[i]<<",";}return 0;
}

output

从小到大:
0,1,3,从大到小:
3,1,0,

注意 sort 需要头文件 #include <algorithm>

访问(直接数组访问&迭代器访问)

#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;int main()
{//顺序访问vector<int>obj;for(int i=0;i<10;i++){obj.push_back(i);   } cout<<"直接利用数组:"; for(int i=0;i<10;i++)//方法一 {cout<<obj[i]<<" ";}cout<<endl; cout<<"利用迭代器:" ;//方法二,使用迭代器将容器中数据输出 vector<int>::iterator it;//声明一个迭代器,来访问vector容器,作用:遍历或者指向vector容器的元素 for(it=obj.begin();it!=obj.end();it++){cout<<*it<<" ";}return 0;
}

output

直接利用数组:0 1 2 3 4 5 6 7 8 9 
利用迭代器:0 1 2 3 4 5 6 7 8 9 

二维数组两种定义方法

法一

#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;int main()
{int N=5, M=6; vector<vector<int> > obj(N); //定义二维动态数组大小5行 for(int i =0; i< obj.size(); i++)//动态二维数组为5行6列,值全为0 { obj[i].resize(M); } for(int i=0; i< obj.size(); i++)//输出二维动态数组 {for(int j=0;j<obj[i].size();j++){cout<<obj[i][j]<<" ";}cout<<"\n";}return 0;
}

output 5 行 6 列

0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0

法二

#include <string.h>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;int main()
{int N=5, M=6; vector<vector<int> > obj(N, vector<int>(M)); //定义二维动态数组5行6列 for(int i=0; i< obj.size(); i++)//输出二维动态数组 {for(int j=0;j<obj[i].size();j++){cout<<obj[i][j]<<" ";}cout<<"\n";}return 0;
}

output

0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 
0 0 0 0 0 0 

7、参考

  • C++ vector 容器浅析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419769.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图片转pdf格式怎么弄?非常值得推荐的图片转PDF方法

图片转pdf格式怎么弄&#xff1f;在数字化办公和日常生活中&#xff0c;将图片转换成 PDF 格式已经成为一种常见而有效的处理方式。这种转换不仅能够将多张图片汇总到一个文件中&#xff0c;从而简化管理和共享的过程&#xff0c;还能够确保图像的原始质量和格式不会因不同设备…

WPS如何查看已添加到词典的单词

WPS Office&#xff08;12.1.0.17827&#xff09; ① 点击文件&#xff0c;在文件中找到选项 ② 找到拼写检查并点击自定义词典 ③ 如果要删除已添加到词典的"错词"&#xff0c;则点击修改 ④ 选择"错词", 点击删除

STM32重定义printf,实现串口打印

在“usart.c”文件中加入以下代码 #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch) #else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f) #endifPUTCHAR_PROTOTYPE{HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);return ch; }…

快速搞定会议记录,别错过这四款语音识别转文字!

作为一个偶尔需要在办公室做会议记录和采访录音整理的打工人。我表示&#xff0c;真的不想要练手速了&#xff0c;尤其是很多人在讲话的时候并不会在意别人来不来得及记录&#xff0c;只在意自己讲不讲的完&#xff0c;好在后面我找了几款语音识别转文字的工具&#xff0c;可算…

52%回报率背后:GPT-4o量化交易机器人的30天实战传奇

_本文介绍了如何利用GPT-4o&#xff0c;结合量化交易技术创建盈利的交易机器人策略&#xff0c;并通过回溯测试验证这一策略的有效性。 量化交易可以盈利&#xff0c;但只有拥有丰富资源、拥有编码和数学技能的交易者或大型机构才能使用。 但时代变了&#xff01;现在有了 Cha…

idear获取git项目

最近想下载个ruoyi项目来包装简历&#xff0c;结果打开idear总是上一个项目&#xff0c;找不到get for vcs只好自己捣鼓了&#xff0c;顺便记录留着下次用。 步骤&#xff1a; 1. 2. 3.输入我们想访问的地址 eg: 点击克隆&#xff0c;我们就能获取项目到本地了。

【零基础必看的数据库教程】——SQL WHERE 子句

WHERE 子句用于提取那些满足指定条件的记录&#xff0c;过滤记录。 SQL WHERE 语法&#xff1a; SELECT column1, column2, ... FROM table_name WHERE condition; 参数说明&#xff1a; column1, column2, ...&#xff1a;要选择的字段名称&#xff0c;可以为多个字段。如…

网络层ip协议

一.概念 ip协议主要是为了在复杂的网络环境中确定一个合适的路径来传输主机间的数据。简单来说就是用来确定主机的位置。 ip协议中的一些设备如下&#xff1a; 主机: 配有 IP 地址, 但是不进行路由控制的设备;路由器: 即配有 IP 地址, 又能进行路由控制;节点: 主机和路由器的统…

浅谈OLTP 与 OLAP 数据建模的差异

OLTP 与 OLAP&#xff1a;常见工作流 联机分析处理 (OLAP) 和联机事务处理 (OLTP) 是两种主要的数据处理系统。两者之间存在多种差异。 OLTP 系统旨在处理来自多个用户的多个事务&#xff0c;它们通常用于许多应用程序的后端。例如&#xff0c;在线商务网站将使用 OLTP 系统来…

Spring6梳理7——依赖注入之特殊类型属性

目录 ①字面量赋值 ②null值 ③xml实体 ④CDATA节 ①字面量赋值 什么是字面量&#xff1f; int a10; 字面量是在源代码中用来表示固定值的表示法。几乎所有的计算机编程语言都支持基本值的字面量表示&#xff0c;例如整数、浮点数和字符串。许多语言还支持布尔类…

网络运维管理:确保企业网络系统稳定运行之道

在当今数字化时代&#xff0c;企业网络系统的稳定运行和高效管理是企业业务持续发展和创新的关键。网络运维管理的核心目标正是确保网络设备和服务的高可用性、优化网络性能、保护网络安全、快速解决网络故障以及有效管理网络配置。本文将深入探讨网络运维管理系统的关键组件、…

CSS - 搜索框小动效

点击搜索框动画变长&#xff0c;搜索框有内容不变&#xff0c;无内容失去焦点&#xff0c;变回原来模样。<div :class"type true ? s_r_z : s_r" click"onChange"><div class"input_s"><input blur"handleBlur" v-mo…

计算机毕业设计选题推荐-流浪动物领养管理系统-Java/Python项目实战(亮点:数据可视化分析、智能推荐)

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

uniapp 各个端接入腾讯滑动行为验证码示例

验证调起页面&#xff1a; <template><view class"app"><text>{{ obj.ret }}</text><button click"varify">验证</button></view> </template><script>export default{data(){return{obj: {}}},on…

黑马大事件项目开发

项目介绍 演示网站&#xff1a; https://fe-bigevent-web.itheima.net/login 实现 1&#xff09;创建项目 npm init vuelatest2&#xff09;安装项目需要的依赖 npm install element-plus --save npm install axios npm install sass -D3&#xff09;在main.js中加入Elem…

金融行业项目管理软件分享!华福证券上线奥博思 PowerProject 项目管理系统

如何正确的评估一款项目管理软件是否适合金融行业&#xff1f;金融机构例如银行、券商等企业在选型项目管理软件时可以从以下几方面考虑&#xff1a; 1&#xff0c;管理驾驶舱 金融机构需要对项目的各项数据进行深入分析&#xff0c;以便做出科学的决策。软件应能够生成详细的…

Cesium 展示——静态水添加动态波纹,模拟真实水面效果

文章目录 需求分析材料准备根据几何实例创建贴地面图元将图元添加到集合补充需求 分析 材料准备 首先我们需要准备水波的图片,放在最后大家自行

AI prompt(提示词)

# 好用的用于学习的AI提示词 ## 费曼学习法 请使用费曼学习法&#xff0c;用简单的语言解释&#xff08;量子力学&#xff09;是什么&#xff0c;并提供一个简单的例子来说明它如何应用 ## 帕累托法则&#xff08;80/20原则&#xff09; 将&#xff08;量子力学&#xff09;最…

Android 12 SystemUI下拉状态栏禁止QuickQSPanel展开

1.概述 遇到需求&#xff0c;QuickQSPanel首次下拉后展示快捷功能模块以后就是显示QuickQSPanel&#xff0c;而不展开QSPanel&#xff0c;接下来要从下滑手势下拉出状态栏分析功能实现。也就是直接是展开状态。 2、涉及核心类 frameworks\base\packages\SystemUI\src\com\and…

数据资产:新时代的财富密码

嘿&#xff0c;朋友们&#xff01;今天要和大家聊聊一个在数字化时代重要的话题 —— 数据资产&#xff0c;它可是新时代的财富密码哦 数据资产的庐山真面目 数据资产呢&#xff0c;就是企业或者个人拥有或控制的&#xff0c;能带来经济效益的数据资源。它的特点可不少呢。首先…