【C++】vector常见的使用方式

前言:在上一篇中我们讲到了string类的模拟实现,今天我们将进一步的去学习vector的一些常用的使用方法。

💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:高质量C++学习 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
在这里插入图片描述


目录标题

  • 什么是vector
  • vector的使用
    • vector构造函数的使用
    • vector常见函数的使用
      • 迭代器的使用
      • rebegin()和rend()函数
      • push_back():在向量的末尾添加一个元素
      • pop_back():删除向量的最后一个元素
      • size():返回向量中元素的个数
      • empty():检查向量是否为空,如果为空则返回 true,否则返回 false
      • capacity()
      • clear():清空向量中的所有元素
      • front():返回向量的第一个元素
      • back():返回向量的最后一个元素
      • insert():在指定位置插入一个或多个元素
      • erase():删除指定位置或指定范围的元素
      • resize():调整向量的大小
      • swap():交换两个向量的内容
      • vector中operator[]
    • vector中嵌套vector的二维矩阵或多维数组

什么是vector

在C++中,vector是一种动态数组容器,可以存储一系列具有相同数据类型的元素。它提供了一些操作函数,如插入、删除、访问等,使得对数组进行操作更加方便和灵活。

与普通的数组相比,vector具有以下优点:

  1. 可以在运行时动态调整大小,不需要事先指定大小;
  2. 可以自动处理内存分配和释放,减少手动管理内存的工作量;
  3. 提供了更多的操作函数,如插入、删除、查找等;
  4. 可以通过下标访问元素。

vector的使用

vector构造函数的使用

  1. 默认构造函数
vector<int> vec; // 创建一个空的整数向量
  1. 带有初始值的构造函数:
int main()
{//vector<int> vec; // 创建一个空的整数向量int n = 0,value = 0;cout << "输入元素个数" << endl;cin >> n;vector<int> vec(n); // 创建一个包含 n 个默认初始化的整数元素的向量for (auto e : vec)//遍历容器中的值{cout << e << " ";}cout << endl;cout << "输入元素的值" << endl;cin >> value;vector<int> vec1(n, value); // 创建一个包含 n 个值为 value 的整数元素的向量for (auto e : vec1)//遍历容器中的值{cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述

  1. 复制构造函数
int main()
{vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 创建一个包含初始元素的向量vector<int> vec2(vec1); // 使用 vec1 的副本创建向量 vec2for (auto s : vec2){cout << s << " ";}cout << endl;return 0;
}

在这里插入图片描述
4. 列表初始化 (C++11 及以上版本)

int main()
{vector<int> vec4{ 1, 2, 3, 4, 5 }; // 使用列表初始化创建向量 vec4for (auto s : vec4){cout << s << " ";}return 0;
}

在这里插入图片描述

  1. 区间构造函数
int main()
{vector<int> vec1 = { 1, 2, 3, 4, 5 }; // 创建一个包含初始元素的向量vector<int> vec2(vec1); // 使用 vec1 的副本创建向量 vec2for (auto s : vec2){cout << s << " ";}cout << endl;vector<int> vec3(vec1.begin(), vec1.end()); // 使用迭代器指定区间来创建向量 vec3for (auto s : vec3){cout << s << " ";}return 0;
}

在这里插入图片描述


vector常见函数的使用

迭代器的使用

在C++中,vector类提供了**begin()end()**成员函数来获取指向容器中第一个元素和最后一个元素之后位置的迭代器。

调用begin()函数会返回一个指向容器中第一个元素的迭代器。调用end()函数会返回一个指向容器中最后一个元素之后位置的迭代器。

int main() 
{std::vector<int> vec = { 1, 2, 3, 4, 5 };// 使用begin()函数获取指向第一个元素的迭代器std::vector<int>::iterator it_begin = vec.begin();// 使用end()函数获取指向最后一个元素之后位置的迭代器std::vector<int>::iterator it_end = vec.end();// 使用迭代器遍历vector并输出所有元素for (std::vector<int>::iterator it = it_begin; it != it_end; ++it) {std::cout << *it << " ";}return 0;
}

在这里插入图片描述


rebegin()和rend()函数

在使用vector中的rbegin()rend()函数时,请按照以下步骤进行操作:

  1. 在代码中包含<vector>头文件。
  2. 创建一个vector对象并向其中添加元素。
  3. 使用rbegin()函数获取指向向量最后一个元素的迭代器。
  4. 使用rend()函数获取指向向量中第一个元素之前位置的迭代器。
  5. 使用循环以逆序的方式遍历向量,从rbegin()函数返回的迭代器开始,到rend()函数返回的迭代器结束。

下面是一个示例来说明用法:

#include <iostream>
#include <vector>int main() {std::vector<int> myVec = {1, 2, 3, 4, 5};// 以逆序的方式遍历向量for (auto it = myVec.rbegin(); it != myVec.rend(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

输出结果:

5 4 3 2 1

在这个例子中,我们创建了一个名为myVecvector对象,并用一些整数值进行了初始化。然后,我们使用for循环和一个逆序迭代器(rbegin()函数)和一个普通迭代器(rend()函数)来以逆序的方式打印向量的元素。

push_back():在向量的末尾添加一个元素

int main()
{vector<int> vec;vec.push_back(10); // 向 vec 中添加元素 10vec.push_back(20); // 向 vec 中添加元素 20vec.push_back(20); // 向 vec 中添加元素 20vec.push_back(0); // 向 vec 中添加元素 20for (auto e : vec){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述


pop_back():删除向量的最后一个元素

int main()
{vector<int> vec = { 10, 20, 30,40,50 };cout << "删除前" << endl;for (auto e : vec){cout << e << " ";}cout << endl;cout << "删除后" << endl;vec.pop_back(); // 删除 vec 的最后一个元素for (auto e : vec){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述


size():返回向量中元素的个数

int main()
{vector<int> vec = { 10, 20, 30 };cout <<"该容器的元素个数是: " << vec.size() << endl;return 0;
}

在这里插入图片描述


empty():检查向量是否为空,如果为空则返回 true,否则返回 false

int main()
{vector<int> vec = { 1,2 };bool isEmpty = vec.empty(); // 返回 true,因为 vec 是空的if (isEmpty){cout << "该容器是空的" << endl;}else{cout << "该容器不是空的" << endl;}return 0;
}

在这里插入图片描述


capacity()

在使用vectorcapacity()函数时,它返回的是vector当前分配的内存容量大小,即可以容纳的元素数量。以下是使用capacity()函数的几个常见情况:

  1. 获取vector的容量:使用capacity()函数可以获取当前vector的容量。
#include <iostream>
#include <vector>int main() {std::vector<int> myVec;std::cout << "Vector capacity: " << myVec.capacity() << std::endl;return 0;
}

输出结果:

Vector capacity: 0

在这个例子中,我们创建了一个名为myVec的空vector对象,并使用capacity()函数获取其容量。由于vector是空的,所以容量为0。

  1. 预分配容量:有时候可以使用reserve()函数来预分配vector的容量,以减少不必要的重新分配的次数。
#include <iostream>
#include <vector>int main() {std::vector<int> myVec;myVec.reserve(10);  // 预分配10个元素的容量std::cout << "Vector capacity: " << myVec.capacity() << std::endl;return 0;
}

输出结果:

Vector capacity: 10

在这个例子中,我们使用reserve()函数预分配了10个元素的容量,然后使用capacity()函数获取当前容量。

  1. 动态调整容量:vector会根据需要自动调整容量,以适应元素的添加和删除。当vector的元素数量超过当前容量时,会自动增加容量以容纳更多元素。
#include <iostream>
#include <vector>int main() {std::vector<int> myVec;std::cout << "Initial capacity: " << myVec.capacity() << std::endl;for (int i = 0; i < 10; ++i) {myVec.push_back(i);std::cout << "Vector capacity after adding " << i << ": " << myVec.capacity() << std::endl;}return 0;
}

输出结果:

Initial capacity: 0
Vector capacity after adding 0: 1
Vector capacity after adding 1: 2
Vector capacity after adding 2: 4
Vector capacity after adding 3: 4
Vector capacity after adding 4: 8
Vector capacity after adding 5: 8
Vector capacity after adding 6: 8
Vector capacity after adding 7: 8
Vector capacity after adding 8: 16
Vector capacity after adding 9: 16

在这个例子中,我们创建了一个名为myVec的空vector对象,并使用capacity()函数获取初始容量。然后,我们使用push_back()函数向vector添加元素,并使用capacity()函数获取每次添加元素后的容量。可以看到,当元素数量超过当前容量时,vector会动态调整容量以容纳更多元素,容量的增长规律可能是指数级的(取决于编译器)。


clear():清空向量中的所有元素

int main()
{vector<int> vec = { 10, 20, 30 };cout << "清空前" << endl;for (auto e : vec){cout << e << " ";}cout << endl;cout <<"该容器的元素个数是:" << vec.size() << endl;//查看容器中元素个数vec.clear(); // 清空 vec 中的所有元素cout << "清空后" << endl;for (auto e : vec){cout << e << " ";}cout << endl;cout << "该容器的元素个数是:" << vec.size() << endl;//查看容器中元素个数return 0;
}

在这里插入图片描述


front():返回向量的第一个元素

int main()
{vector<int> vec = { 10, 20, 30 };int firstElement = vec.front(); // 返回 10cout << firstElement << endl;return 0;
}

在这里插入图片描述


back():返回向量的最后一个元素

int main()
{vector<int> vec = { 10, 20, 30 };int lastElement = vec.back(); // 返回 30cout << lastElement << endl;return 0;
}

在这里插入图片描述


insert():在指定位置插入一个或多个元素

int main()
{vector<int> vec = { 10, 20, 30 };vec.insert(vec.begin() + 1, 15); // 在索引为 1 的位置插入元素 15,vec 变为 {10, 15, 20, 30}for (auto e: vec){cout << e << " ";}return 0;
}

在这里插入图片描述


erase():删除指定位置或指定范围的元素

int main()
{vector<int> vec = { 10, 20, 30 ,40, 50};vec.erase(vec.begin() + 1);vec.erase(vec.begin(), vec.begin() + 2); for (auto e: vec){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述


resize():调整向量的大小

int main()
{vector<int> vec = { 10, 20, 30 };vec.resize(5); // 将 vec 调整为包含 5 个元素,未指定的元素将被默认初始化for (auto e: vec){cout << e << " ";}cout << endl;vector<int> vec1 = { 10, 20, 30 };vec1.resize(10, 9);//将vec1调整成10个元素,未被指定的元素 初始化成9for (auto e : vec1){cout << e << " ";}cout << endl;return 0;
}

在这里插入图片描述


swap():交换两个向量的内容

int main()
{vector<int> vec1 = { 10, 20 };vector<int> vec2 = { 30, 40 };cout << "交换前" << endl;for (auto e : vec1){cout << e << " ";}vec1.swap(vec2); // 交换 vec1 和 vec2 的元素,vec1 变为 {30, 40},vec2 变为 {10, 20}cout << endl;cout << "交换后" << endl;for (auto e : vec1){cout << e << " ";}
}

在这里插入图片描述


vector中operator[]

在C++的vector中,operator[]是用于访问并操作vector中的元素的重载运算符。它允许您使用索引来访问和修改vector中的特定元素。以下是对operator[]的使用示例:

#include <iostream>
#include <vector>int main() {std::vector<int> myVec = {1, 2, 3, 4, 5};// 通过使用索引来访问和修改元素std::cout << "Element at index 2: " << myVec[2] << std::endl;myVec[3] = 10;std::cout << "Modified element at index 3: " << myVec[3] << std::endl;return 0;
}

输出结果:

Element at index 2: 3
Modified element at index 3: 10

在这个例子中,我们创建了一个名为myVecvector对象,并使用初始化列表初始化其元素。然后,我们使用operator[]来访问索引为2和3的元素,并分别输出它们的值。接下来,我们将索引为3的元素修改为10,并再次使用operator[]访问并输出修改后的值。

需要注意的是,operator[]没有边界检查,如果使用超出vector有效索引范围的索引进行访问,会导致未定义的行为。因此,在使用operator[]时,务必确保所使用的索引在vector的有效范围内。

此外,还可以将operator[]用于循环遍历vector中的元素:

#include <iostream>
#include <vector>int main() {std::vector<int> myVec = {1, 2, 3, 4, 5};// 使用operator[]遍历vector中的元素for (size_t i = 0; i < myVec.size(); ++i) {std::cout << "Element at index " << i << ": " << myVec[i] << std::endl;}return 0;
}

输出结果:

Element at index 0: 1
Element at index 1: 2
Element at index 2: 3
Element at index 3: 4
Element at index 4: 5

在这个例子中,我们使用operator[]在循环中遍历vector中的元素。通过递增索引变量i,我们可以依次访问vector中的元素,并输出它们的索引和值。


vector中嵌套vector的二维矩阵或多维数组

在C++中,可以使用vector嵌套vector来创建二维矩阵或多维数组。这种嵌套的vector可以用于存储和访问多个行和列的数据。

int main() {// 定义数组的大小int rows = 3;int cols = 4;// 创建一个二维vectorstd::vector<std::vector<int>> matrix(rows, std::vector<int>(cols));// 对二维vector进行赋值int count = 1;for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {matrix[i][j] = count++;}}// 打印二维vector的内容for (int i = 0; i < rows; i++) {for (int j = 0; j < cols; j++) {std::cout << matrix[i][j] << " ";}std::cout << std::endl;}return 0;
}

在这里插入图片描述


好啦,今天的内容就到这里啦,下期内容预告vector的常见函数模拟实现,博主前段时间有点事情,后面这段时间会加班加点的更新!


结语:今天的内容就到这里吧,谢谢各位的观看,如果有讲的不好的地方也请各位多多指出,作者每一条评论都会读的,谢谢各位。


🌏🗺️ 这里祝各位接下来的每一天好运连连 💞💞

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

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

相关文章

命运方舟台服注册 命运方舟台服怎么注册?不会操作看这里

命运方舟台服注册 命运方舟台服怎么注册&#xff1f;不会操作看这里 命运方舟作为今年备受瞩目的一款MMORPG类型游戏&#xff0c;在上线前的预约数量已经一次又一次创下新高。这款游戏的开发商Smile gate真是给玩家们带来了一款让人眼前一亮的作品。游戏创建在虚幻引擎的基础…

用esp prog烧录ESP32-C3板踩坑

附ESP32C3的GPIO一览&#xff1a; vscode选择Jtag烧录&#xff0c;终端输出esp_usb_jtag: could not find or open device&#xff1a; D:\Devtools\Espressif\tools\openocd-esp32\v0.12.0-esp32-20230921\openocd-esp32\bin\openocd.exe -f board/esp32s3-builtin.cfgOpen O…

【电路笔记】-带阻滤波器

带阻滤波器 文章目录 带阻滤波器1、概述2、典型带阻滤波器配置3、带阻滤波器示例14、陷波滤波器5、带阻滤波器示例26、总结带阻滤波器也称为陷波滤波器,阻止并拒绝位于其两个截止频率点之间的频率,并传递该范围两侧的所有这些频率。 1、概述 通过将基本 RC 低通滤波器与 RC …

ElasticSearch教程(详解版)

本篇博客将向各位详细介绍elasticsearch&#xff0c;也算是对我最近学完elasticsearch的一个总结&#xff0c;对于如何在Kibana中使用DSL指令&#xff0c;本篇文章不会进行介绍&#xff0c;这里只会介绍在java中如何进行使用&#xff0c;保证你看完之后就会在项目中进行上手&am…

Arduino烧录esp8266

default_encoding: cp936 Assume aggressive ‘core.a’ caching enabled. Note: optional global include file ‘arduino_modified_sketch_764314\Blink.ino.globals.h’ does not exist. Read more at https://arduino-esp8266.readthedocs.io/en/latest/faq/a06-global-bui…

写字静不下心?不如试试这些“笨方法”

夏天悄悄热起来啦&#xff5e;有人说&#xff0c;想踏踏实实写一会儿&#xff0c;但又静不下心&#xff0c;耐不住性子&#xff0c;快收下这四个小锦囊&#xff0c;与古人一起笨拙精进吧&#xff01;    1、不论输赢      每次课前&#xff0c;暄桐林曦老师总会强调&am…

内网-win1

一、概述 1、工作组&#xff1a;将不同的计算机按功能(或部门)分别列入不同的工作组 (1)、查看&#xff08;windows&#xff09; 查看当前系统中所有用户组&#xff1a;打开命令行--》net localgroup查看组中用户&#xff1a;打开命令行 --》net localgroup 后接组名查看用户…

FreeRTOS任务调度机制(源码讲解)

任务的调度机制(核心是链表)&#xff01;&#xff01;&#xff01; 使用链表来管理任务 在我前面写的FreeRTOS任务(深入到源码进行分析)&#xff0c;我创建了三个任务&#xff0c;他们的优先级都是一样的&#xff0c;所以他们在FreeRTOS中是轮流执行的&#xff0c;实际上&…

19.1 简易抽奖

准备一个数组&#xff0c;里面添加10个奖品数据&#xff0c;让奖品数据快速的在盒子中随机显示&#xff0c;通过按钮控制盒子里面的内容停止。 效果图&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

npm install pubsub-js报错的解决汇总

我在练习谷粒商城P83时&#xff0c;选择分类时触发向后端请求选择分类catId绑定的品牌数据&#xff0c;发现前端控制台报错&#xff1a; "PubSub is not definded",找不到pubsub。 因为缺少pubsub包&#xff0c;所以开始安装此包。 于是在网上一顿搜索猛如虎&…

xilinx ip自带XDC只读

检查生成的IP核再目录下显示的文件类型是不是.xcix 如果是的话&#xff0c;重新生成为.xci 再二次编辑即可 或者 将框柱的部分不选择&#xff0c;从新生成

《计算机工程与应用》最新投稿经验2024年5月

研二下第一次投稿&#xff0c;深度学习长时间序列预测方向&#xff0c;选择了《计算机工程与应用》期刊&#xff0c;是CSCD扩展刊北大核心&#xff0c;且在24年被EI收录等等。4.10交稿到最后5.31收到录用通知&#xff0c;历时不到2个月&#xff0c;总的来说编辑部效率确实高。 …

LLM背后的基础模型 1

写在最前面的话 任何开源技术是最有生命力的&#xff0c;也是最具分享精神的。一直觉得大模型领域需要有一个系列能够从零开始系统性的讲述领域知识&#xff0c;给与这个领域的从业人员或者对其有兴趣的门外汉及时的帮助。国外承担“布道者”的公司众多&#xff0c;而数砖公司…

云技术最全详解

目录 云技术 1.定义 2.特点 2.类型 2.1IaaS&#xff08;基础设置即服务&#xff09; 2.2PaaS&#xff08;平台即服务&#xff09; 2.3SaaS&#xff08;软件即服务&#xff09; 3.云技术模型 3.1公有云 3.2私有云 3.3混合云 云技术 1.定义 云技术是一种云计算和存储…

如何让 LightRoom 每次导入照片后不自动弹出 SD 卡 LR

如何让 LightRoom 每次导入照片后不自动弹出 SD 卡 LR 在导入窗口左上角有个选项&#xff1a; 导入后弹出 把这个去掉就可以了

Qt Creator(Qt 6.6)拷贝一行

Edit - Preference - Environment&#xff1a; 可看到&#xff0c;拷贝一行的快捷键是&#xff1a; ctrl Ins

数据结构-堆(带图)详解

前言 本篇博客我们来仔细说一下二叉树顺序存储的堆的结构&#xff0c;我们来看看堆到底如何实现&#xff0c;以及所谓的堆排序到底是什么 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;数据结构_普通young man的博客-CSDN博客 若有问题 评…

程序员是牛马吗?

在今天的讨论中&#xff0c;一个引人深思的问题被提出&#xff1a;程序员是否只是现代社会的牛马&#xff1f;这个问题迅速引发了激烈的争论。许多程序员开始意识到&#xff0c;尽管他们辛勤工作&#xff0c;但最终可能仍无法摆脱被剥削的命运。因此&#xff0c;他们渴望改变&a…

MySQL(二)-基础操作

一、约束 有时候&#xff0c;数据库中数据是有约束的&#xff0c;比如 性别列&#xff0c;你不能填一些奇奇怪怪的数据~ 如果靠人为的来对数据进行检索约束的话&#xff0c;肯定是不行的&#xff0c;人肯定会犯错~因此就需要让计算机对插入的数据进行约束要求&#xff01; 约…

混合模型方差分析

文章目录 一、说明二、受试者“间”因素和受试者“内”因素的意思&#xff1f;三、混合模型方差分析回答 3 件事四、混合模型方差分析的假设 一、说明 在本文中&#xff0c;我将讨论一种称为混合模型方差分析的方差分析变体&#xff0c;也称为具有重复测量的 2 因素方差分析。…