【二十八】【C++】vector类的运用复习

vector类的创建

 
#include <iostream>
using namespace std;#include <vector>void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;//创建空的vectorshow(vec);vector<int> vec1(10);//创建10个元素,初始化为int的默认构造函数show(vec1);vector<int> vec2(5, 9);//创建5个元素,初始化为9show(vec2);vector<int> vec3{1, 2, 3, 4, 5};//列表初始化,12345show(vec3);vector<int> vec4(vec3.begin(), vec3.end());//vector的迭代器初始化show(vec4);vector<int> vec5(vec4.begin(), vec4.begin() + 3);//vector的迭代器初始化show(vec5);vector<int> vec6(vec5);//vector的拷贝构造函数show(vec6);vector<int> vec7 = vec6;//vector的赋值运算符重载show(vec7);}

控制台:

 
vector is empty.
0 0 0 0 0 0 0 0 0 0
9 9 9 9 9
1 2 3 4 5
1 2 3 4 5
1 2 3
1 2 3
1 2 3

vector<int> vec;:创建了一个空的vector<int>对象vec

vector<int> vec1(10);:创建了一个包含10个默认初始化(即值为0)的int元素的vector<int>对象vec1

vector<int> vec2(5, 9);:创建了一个包含5个元素,每个元素都初始化为9的vector<int>对象vec2

vector<int> vec3{1, 2, 3, 4, 5};:使用初始化列表创建了一个包含5个元素(1, 2, 3, 4, 5)的vector<int>对象vec3

vector<int> vec4(vec3.begin(), vec3.end());:使用vec3的迭代器范围来创建vec4,复制了vec3中的所有元素。

vector<int> vec5(vec4.begin(), vec4.begin() + 3);:同样使用迭代器范围来创建vec5,但这次只复制了vec4中的前三个元素。

vector<int> vec6(vec5);:使用vec5来进行拷贝构造创建了vec6,复制了vec5中的所有元素。

vector<int> vec7 = vec6;:使用赋值运算符将vec6中的所有元素赋值给了新创建的vector<int>对象vec7

vector类的访问

 
#include <iostream>
using namespace std;
#include <vector>
void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;show(vec);vector<int> vec1(10);show(vec1);vector<int> vec2(10, 8);show(vec2);vector<int> vec3(10);int i = 0;for (auto& x : vec3) {x = i++;}show(vec3);cout << vec3[5] << " " << vec3[8] << " " << vec3[9] << endl;cout << vec3.at(5) << " " << vec3.at(8) << " " << vec3.at(9) << endl;cout << vec3.front() << " " << vec3.back() << endl;cout << vec3.at(10) << endl;//抛出异常之后的程序不会再执行,at可以检查范围,[]不能cout << vec3.at(5) << endl;//cout << vec[10] <<endl;}

控制台:

 
vector is empty.
0 0 0 0 0 0 0 0 0 0
8 8 8 8 8 8 8 8 8 8
0 1 2 3 4 5 6 7 8 9
5 8 9
5 8 9
0 9
terminate called after throwing an instance of 'std::out_of_range'what():  vector::_M_range_check: __n (which is 10) >= this->size() (which is 10)

vector<int> vec; 创建了一个空的vector<int>对象vec

vector<int> vec1(10); 创建了一个包含10个默认初始化(即值为0)的int元素的vector<int>对象vec1

vector<int> vec2(10, 8); 创建了一个包含10个元素,每个元素都初始化为8的vector<int>对象vec2

接下来,创建了另一个包含10个默认初始化的int元素的vector<int>对象vec3。然后,通过for循环,使用引用(auto& x)遍历vec3,将每个元素赋值为其在vector中的索引值。

使用operator[]来访问并打印vec3中索引为5、8、9的元素。

使用at成员函数来访问并打印同样的元素,at函数与operator[]不同之处在于,它会检查索引是否越界,并在越界时抛出一个异常。

front()back()分别用来访问vector的第一个和最后一个元素,并打印它们。

尝试使用at访问索引为10的元素,这将抛出一个越界异常。因为vec3的大小是10,索引范围是0到9,所以索引10是越界的。此行执行后,程序会因为未捕获的异常而终止,后面的代码不会被执行。

vector类的修改

 
#include <iostream>
using namespace std;
#include <vector>
void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;show(vec);vector<int> vec1(10, 7);show(vec1);vector<int> vec2(10);int i = 0;for (auto& x : vec2) {x = i++;}show(vec2);vec2.push_back(10);//尾插vec2.push_back(100);vec2.push_back(1000);show(vec2);vec2.pop_back();//尾删show(vec2);vec2.push_back(200);show(vec2);vec2.pop_back();show(vec2);vec2.push_back(300);show(vec2);vec2.insert(vec2.begin(), 33);//指定位置前面插入元素,迭代器位置show(vec2);vec2.insert(vec2.begin() + 2, 44);show(vec2);vec2.insert(vec2.begin() + 4, 55);show(vec2);vec2.erase(vec2.begin());//删除指定位置的元素,迭代器位置show(vec2);vec2.erase(vec2.begin() + 2);show(vec2);vec2.erase(vec2.begin() + 4);show(vec2);vec2.erase(vec2.begin() + 2);show(vec2);vec2.erase(vec2.begin() + 1);show(vec2);vec2.clear();//清空vectorshow(vec2);}

控制台:

 
vector is empty.
7 7 7 7 7 7 7 7 7 7
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9 10 100 1000
0 1 2 3 4 5 6 7 8 9 10 100
0 1 2 3 4 5 6 7 8 9 10 100 200
0 1 2 3 4 5 6 7 8 9 10 100
0 1 2 3 4 5 6 7 8 9 10 100 300
33 0 1 2 3 4 5 6 7 8 9 10 100 300
33 0 44 1 2 3 4 5 6 7 8 9 10 100 300
33 0 44 1 55 2 3 4 5 6 7 8 9 10 100 300
0 44 1 55 2 3 4 5 6 7 8 9 10 100 300
0 44 55 2 3 4 5 6 7 8 9 10 100 300
0 44 55 2 4 5 6 7 8 9 10 100 300
0 44 2 4 5 6 7 8 9 10 100 300
0 2 4 5 6 7 8 9 10 100 300
vector is empty.

创建并展示空的vector (vec)。

创建并展示一个包含10个元素,每个都初始化为7的vector (vec1)。

创建一个大小为10的vector (vec2),然后使用范围for循环将其每个元素设置为其索引值,并展示。

通过push_back方法在vec2的尾部依次添加元素10、100、1000,并展示每次添加后的结果。

使用pop_back方法从vec2的尾部移除一个元素,并展示结果。

再次使用push_backpop_back方法演示添加和删除元素的过程。

通过insert方法在vec2的指定位置前插入元素(33、44、55),并展示每次插入后的结果。

使用erase方法从vec2中删除指定位置的元素,并展示每次删除后的结果。这部分代码逐步删除了几个特定位置的元素。

调用vec2.clear()方法清空整个vector,然后使用show函数展示清空后的结果,此时打印"vector is empty."。

vector类的大小和容量

 
#include <iostream>
using namespace std;
#include <vector>
void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;show(vec);vector<int> vec1(10);show(vec1);int i = 0;for (auto& x : vec1) {x = i++;}show(vec1);cout << "vec1.size():" << vec1.size() << endl;cout << "vec.size():" << vec.size() << endl;vector<int> vec2(5, 8);show(vec2);cout << "vec2.size():" << vec2.size() << endl;cout << "vectemp.size():" << (vector<int> {1, 2, 3, 4, 5}).size() << endl;cout << "vec2.capacity:" << vec2.capacity() << endl;vec2.push_back(5);vec2.push_back(5);vec2.push_back(5);vec2.push_back(5);vec2.push_back(5);show(vec2);cout << "vec2.capacity:" << vec2.capacity() << endl;vec2.push_back(6);vec2.push_back(6);show(vec2);cout << "vec2.size():" << vec2.size() << endl;cout << "vec2.capacity:" << vec2.capacity() << endl;cout << "vec2.empty:" << vec2.empty() << endl;cout << "vec.empty:" << vec.empty() << endl;show(vec2);cout << vec2.size() << endl;vec2.resize(10);show(vec2);cout << vec2.size() << endl;vec2.resize(15);show(vec2);cout << vec2.size() << endl;vec2.resize(10);vec2.resize(17, 10);show(vec2);cout << vec2.size() << endl;cout << "vec2.capacity:" << vec2.capacity() << endl;vec2.reserve(30);cout << "vec2.capacity:" << vec2.capacity() << endl;vec2.reserve(20);cout << "vec2.capacity:" << vec2.capacity() << endl;}

控制台:

 
vector is empty.
0 0 0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7 8 9
vec1.size():10
vec.size():0
8 8 8 8 8
vec2.size():5
vectemp.size():5
vec2.capacity:5
8 8 8 8 8 5 5 5 5 5
vec2.capacity:10
8 8 8 8 8 5 5 5 5 5 6 6
vec2.size():12
vec2.capacity:20
vec2.empty:0
vec.empty:1
8 8 8 8 8 5 5 5 5 5 6 6
12
8 8 8 8 8 5 5 5 5 5
10
8 8 8 8 8 5 5 5 5 5 0 0 0 0 0
15
8 8 8 8 8 5 5 5 5 5 10 10 10 10 10 10 10
17
vec2.capacity:20
vec2.capacity:30
vec2.capacity:30

创建空的vector<int>并显示。

创建包含10个默认初始化为0的元素的vector<int>并显示。

通过for循环遍历vec1,将每个元素设置为其索引值,并再次显示。

打印vec1和空的vec的大小(.size())。

创建包含5个元素(全部为8)的vector<int>并显示其大小。

创建一个临时的vector<int>,并打印其大小。这个临时对象是在表达式中直接创建并用于调用.size()方法的。

展示vec2的初始容量(.capacity()),然后通过多次调用push_back方法添加元素,并显示容量的变化。

使用.empty()方法检查vec2vec是否为空,并打印结果。

使用.resize()方法调整vec2的大小,并通过调用show函数显示调整后的效果和新的大小。

使用.reserve()方法增加vec2的容量,不改变当前元素的数量但是预留更多的空间以避免将来添加元素时重新分配。.reserve()方法设置容量如果小于原来的capacity不会有任何事情发生。

vector类的迭代器

 
#include <iostream>
using namespace std;
#include <vector>
void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;show(vec);vector<int> vec1{1, 2, 3, 4, 5, 6, 7, 8, 9};show(vec1);vector<int> vec2(vec1);show(vec2);vector<int>vec3(vec1.begin() + 3, vec1.begin() + 6);show(vec3);for (auto it = vec1.begin(); it != vec1.end(); it++) {cout << *it << " ";}cout << endl;for (auto rit = vec1.rbegin(); rit != vec1.rend(); rit++) {cout << *rit << " ";}}

控制台:

 
vector is empty.
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
4 5 6
1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1

创建并显示一个空的vector<int>

使用初始化列表创建包含9个元素(1到9)的vector<int>并显示。

复制vec1创建vec2,再次显示vec2

创建vec3作为vec1的部分复制,包含从vec1的第4个元素到第6个元素(基于0的索引),并显示。

使用正向迭代器(iterator)遍历并打印vec1中的元素。.end()表示最后一个元素的后一个位置

使用反向迭代器(reverse_iterator)遍历并打印vec1中的元素,这会以相反的顺序打印元素。.rbegin()表示最后一个元素,.rend()表示第一个元素前一个位置。

vector类的特殊成员

 
#include <iostream>
using namespace std;
#include <vector>
void show(vector<int> vec) {if (vec.empty()) {cout << "vector is empty." ;}for (auto x : vec) {cout << x << " ";}cout << endl;}
int main() {vector<int> vec;show(vec);vector<int> vec1{1, 2, 3, 4, 5, 6, 7, 8, 9};show(vec1);vector<int> vec2(vec1.begin(), vec1.end());show(vec2);vec1.assign(5, 10);show(vec1);vec1.assign(6, 8);show(vec1);vec1.assign(vec2.begin(), vec2.end());show(vec1);vec1.assign(vec2.begin(), vec2.begin() + 5);show(vec1);vec.swap(vec2);show(vec);show(vec2);}

控制台:

 
vector is empty.
1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
10 10 10 10 10
8 8 8 8 8 8
1 2 3 4 5 6 7 8 9
1 2 3 4 5
1 2 3 4 5 6 7 8 9
vector is empty.

创建并显示一个空的vector<int>

使用初始化列表创建包含9个元素(1到9)的vector<int>并显示。

使用vec1的迭代器范围复制vec1创建vec2,再显示vec2

使用assign方法将vec1的内容替换为5个值为10的元素,并显示。

再次使用assign方法将vec1的内容替换为6个值为8的元素,并显示。

使用assign方法将vec1的内容替换为vec2的完整内容,并显示。

使用assign方法将vec1的内容替换为vec2的前5个元素的内容,并显示。

使用swap方法交换vecvec2的内容,并分别显示它们的新内容。

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

AvP:水平基因转移HGT检测

帮其他人做的一个尝试&#xff0c;本身不太了解这一块&#xff0c;要是做错了请多多包涵 Home GDKO/AvP Wiki GitHub 安装AvP 数据库准备 git clone https://github.com/GDKO/AvP.git conda create --name avp conda activate avp conda install -y -c bioconda mafft bl…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:PluginComponent)

提供外部应用组件嵌入式显示功能&#xff0c;即外部应用提供的UI可在本应用内显示。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。本组件为系统接口。 子组件 无 接口 PluginComponent(value:…

VMware Workstation Pro安装步骤教程

VMware是一款流行的虚拟机软件&#xff0c;允许用户在单一物理机上模拟多个独立的虚拟操作系统。本文将介绍如何安装VMware Workstation Pro并创建一个新的虚拟机。 一、VMware Workstation Pro安装步骤 下载VMware Workstation Pro 访问VMware官网&#xff0c;找到Workstatio…

strstr函数及其模拟实现

模拟实现的代码&#xff1a; char* my_strstr(char* p1, char* p2) {char* startp1;//记录被查找字符串的首地址char* begin p2;//记录要查找字符串的首地址while (1){while (*p1 ! *p2)//首元素不相同&#xff0c;p1向后移动一位{p1;}start p1;//找到了首元素相同的地址&am…

​如何防止网络攻击?

应对不同类型网络攻击的最佳途径是“知己”、“知彼”&#xff0c;在了解它们的工作原理、能够识别其手段、方法及意图的前提下&#xff0c;找出针对性的应对文案。今天&#xff0c;就为大家总结以下防止不同类型网络攻击的有效方法&#xff0c;希望无论是对个人、还是企业和组…

在文件夹下快速创建vue项目搭建vue框架详细步骤

一、首先在你的电脑目录下新建一个文件夹 进入该文件夹并打开控制台&#xff08;输入cmd指令&#xff09; 进入控制台后输入 vue create springboot_vue (自己指定名称) 如果出现这类报错如&#xff1a;npm install 的报错npm ERR! network request to http://registry.cnp…

Node.js 中的 HTTP 模块教程

在 Node.js 中&#xff0c;HTTP 模块是一个核心模块&#xff0c;用于处理网络请求和响应。通过 HTTP 模块&#xff0c;我们可以创建 HTTP 服务器和客户端&#xff0c;实现网络通信和数据交互。本教程将介绍如何使用 Node.js 的 HTTP 模块来创建一个简单的 HTTP 服务器。 1. 创…

Day44| 518 零钱兑换 II 377 组合总和 Ⅳ

目录 518 零钱兑换 II 377 组合总和 Ⅳ 518 零钱兑换 II class Solution { public:int change(int amount, vector<int>& coins) {//1 dp数组代表j时能凑成j的方法vector<int> dp(amount 10, 0);//2 初始化//注意本题我们凑成amount 0的方式是1种就…

Kindle刷安卓系统,安装微信读书教程

本文是由kindle第八代版本&#xff08;固件版本是5.16.2.1.1&#xff09;实践&#xff0c;根据网络资源整理而来。 一、越狱 主要参考&#xff1a;Kindle 通用越狱教程&#xff1a;适用版本小于等于 5.16.2.1.1 固件 – 书伴。 辅助参考&#xff1a;Kindle最新越狱体验&…

简单使用Xmind

xmind找不到快捷键提示&#xff0c;也没有按钮介绍&#xff0c;使用起来还得搜索一下&#xff0c;还挺麻烦的&#xff0c;如果有快捷键&#xff1a; 添加同级主题Enter添加子主题Insert / Tab删除主题Delete添加标注AltEnter主题内换行CtrlEnter拷贝CtrlC粘贴CtrlV撤销CtrlZ …

python读取大型csv文件,降低内存占用,提高程序处理速度

文章目录 简介读取前多少行读取属性列逐块读取整个文件总结参考资料 简介 遇到大型的csv文件时&#xff0c;pandas会把该文件全部加载进内存&#xff0c;从而导致程序运行速度变慢。 本文提供了批量读取csv文件、读取属性列的方法&#xff0c;减轻内存占用情况。 import pand…

setpci的掩码操作使用说明

setpci -s $BDF ECAP_ACS06.wval:mask mask为1的位将被赋值val里面的对应的位的值 例如: setpci -s $RP_BDF ECAP_ACS06.w0 setpci -s $RP_BDF ECAP_ACS06.w0x10:0x10 setpci -s $RP_BDF ECAP_ACS06.w 的值是 0x10 setpci -s $RP_BDF ECAP_ACS06.w0:0x10 setpci -s $RP_B…

力扣由浅至深 每日一题.03 罗马数字转整数

别灰心&#xff0c;好运早晚会降临的 —— 24.3.11 13. 罗马数字转整数 简单题 罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L …

Java 包装类:原始数据类型与迭代器

Java Iterator Iterator 接口提供了一种迭代集合的方法&#xff0c;即顺序访问集合中的每个元素。它支持 hasNext() 和 next() 方法&#xff0c;用于检查是否存在下一个元素以及获取下一个元素。 获取 Iterator 可以使用集合的 iterator() 方法获取 Iterator 实例&#xff1…

纯前端Web网页内嵌AutoCAD,支持在线编辑DWG、dxf等文档。

随着企业信息化的发展&#xff0c;越来越多的企业有网页在线浏览和编辑DWG文档&#xff08;AutoCad生成的文档&#xff09;的需求&#xff0c;但是新版浏览器纷纷取消了对NPAPI插件的支持&#xff0c;导致之前一些可以在线在线浏览和编辑DWG文档纷纷失效&#xff0c;今天推荐一…

【掌握版本控制:Git 入门与实践指南】操作仓库文件|分支管理

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;泥中に咲く—ウォルピスカーター 0:34━━━━━━️&#x1f49f;──────── 4:46 &#x1f504; ◀️ ⏸ ▶…

Effective C++ 学习笔记 条款25 考虑写出一个不抛异常的swap函数

swap是个有趣的函数。原本它只是STL的一部分&#xff0c;而后成为异常安全性编程&#xff08;exception-safe programming&#xff0c;见条款29&#xff09;的脊柱&#xff0c;以及用来处理自我赋值可能性&#xff08;见条款11&#xff09;的一个常见机制。由于swap如此有用&am…

揭秘反向代理:探索其神秘之处

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

141 Linux 系统编程18,线程,ps –Lf 进程 查看LWP,线程间共享数据,优缺点,编译加-lpthread,

一 线程概念 什么是线程 LWP&#xff1a;light weight process 轻量级的进程&#xff0c;本质仍是进程(在Linux环境下) 进程&#xff1a;独立地址空间&#xff0c;拥有PCB 线程&#xff1a;有独立的PCB&#xff0c;但没有独立的地址空间(共享) 区别&#xff1a;在于是否共…

【1688运营】如何拆解竞争对手店铺和单品数据?

关注竞争对手数据是1688运营中不可或缺的一环&#xff0c;它有助于企业更好地了解市场环境、发现市场机会、学习成功经验、预测市场变化以及提升竞争力。以下是一些建议&#xff0c;帮助你全面、深入地分析竞争对手的店铺和单品数据&#xff1a; 1、监控店铺数据 可以通过店雷…