vector类

 > 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:熟悉vector库

> 毒鸡汤:从人生低谷走上人生巅峰是一条很漫长,一开始会很累,但是慢慢就会习惯这种感觉,这说明你在不断的成长。

> 望小伙伴们点赞👍收藏✨加关注哟💕💕 

🌟前言

        相信看完博主的string类CSDN,学习vector会很轻松的🤭🤭,咱们依旧参考c++的官网:cplusplus.com - The C++ Resources Network

 ⭐主体

        这里就需要浅谈一下什么vector,基于在数组的问题,当我们创建一个数组时,此时元素的类型已经锁定,而vector就可以很好的解决这个问题。当然vector不仅仅是这些用法,那咱们就看看vector有啥子东西值得我们学习。

        咱们的主题部分还是按照官网的分类来,具体分为下面这些板块:Member functions(成员函数),Iterators(迭代器),Capacity(容量),Element access(元素访问),Modifiers(修改器),Non-member function (非成员函数)☺️☺️☺️。

🌙Member functions(成员函数)

每一个接口的成员函数都很重要,无论是拷贝构造还是赋值运算重载,都贯彻c++。

💫constructor(构造函数)

根据使用的构造函数版本初始化其值。

在vector的构造函数中有许多的模板,那我们看看到底有哪些类型模板🧐🧐。

1️⃣

这种构造函数本质上是提供一种无参构造

default (1)	 explicit vector (const allocator_type& alloc = allocator_type());

咱们看看它的使用:

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<char> v1;for (auto ch : v1){cout << ch << endl;}return 0;
}

运行结果:

 2️⃣

这种构造函数本质上是提供一个类模板

fill (2)	
explicit vector (size_type n, const value_type& val = value_type(),const allocator_type& alloc = allocator_type());
  • 💦size_type n:无符号整形
  • 💦const value_type& val = value_type():模板参数类型
  • 💦const allocator_type& alloc = allocator_type():const分配器类型

第三个参数咱们不讲解,只需懂得前面两个参数就行。

咱们看看它的使用:

#include<iostream>
#include<vector>
using namespace std;
int main()
{int a = int();double b = double();char c = char();cout << a << endl;cout << b << endl;printf("%d", c);return 0;
}

运行结果:

解析:

在c++当中给每个自定义类型也创建了对应的默认构造函数,其构造的默认结果为0。

3️⃣

这种构造函数本质上是提供一个迭代器

range (3)	
template <class InputIterator>vector (InputIterator first, InputIterator last,const allocator_type& alloc = allocator_type());
  • 💦第一个参数迭代器开始的地方
  • 💦第二个参数就是迭代器结束的地方
  • 💦第三个参数const分配器类型

第三个参数咱们不讲解,只需懂得前面两个参数就行。

咱们看看它的使用:

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> v{ 1, 2, 3,4 };vector<int> v1(v.begin(), v.end());for (auto ch : v1){cout << ch << endl;}return 0;
}

运行结果:

 4️⃣

这种构造函数本质上就是拷贝构造,创建一个对象的时候将另外一个对象的内容初始化给新创建的对象

copy (4)	vector (const vector& x);

咱们看看它的使用:

#include<iostream>
#include<vector>
using namespace std;
int main()
{vector<int> v1{ 1,2,3,4,5 };vector<int>v2(v1);for (auto ch : v2){cout << ch << endl;}return 0;
}

运行结果:

💫operator(赋值重载)

这个就是赋值重载,将一个vector对象的内容赋值给另一个vector对象

 咱们看看它的使用:

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> v1{ 1,2,3,4,5 };vector<int>v2(v1);v2 = v1;for (auto ch : v2){cout << ch << endl;}return 0;
}

运行结果:

🌙Iterators(迭代器)

        我们已经在string类中讲解这个迭代器,在vector中使用迭代器基本和string类一样,这里我们就加加速,搞快点😏😏。

 💫利用begin和end实现迭代器

  • begin()函数返回的是vector的首位置
  • end()函数返回的是vector最后一个位置(即最后一个元素的下一个位置)

咱看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };vector<int>::iterator it = v1.begin();while (it != v1.end()){cout << *it;++it;}cout << endl;return 0;
}

运行结果:

 💫范围for实现迭代器

不知道小伙伴还记得auto关键字不,auto可以推导出元素属性(int,char)

咱们看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };for (auto ch : v1){cout << ch;}cout << endl;return 0;
}

运行结果:

 💫反向迭代器

这里需要介绍一下rbegin()和rend()这两个函数,这两个函数是用来配合反向迭代器使用的。

  • rbegin()函数返回的是vector的最后一个有效元素
  • rend()函数返回的是vector的第一个元素的前一个位置。

咱们看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };vector<int>::reverse_iterator rit = v1.rbegin();while (rit != v1.rend()){cout << *rit;rit++;}cout << endl;return 0;
}

运行结果:

💫const修饰的迭代器

const修饰的迭代器是不可以改变的(只能读不能写)

咱们看看代码:

#include <iostream>
#include <vector>using namespace std;
void Func(const vector<int> v)
{vector<int>::const_iterator cit = v.begin();// 读操作while (cit != v.end()){cout << *cit;cit++;}cout << endl;// 不能进行写操作,会报错// cit = s.begin();// while (cit != s.end())// {//     (*cit) += 1;//     cout << *cit;//     cit++;// }
}

🌙Capacity(容量)

学习这个板块还是比较简单的,也运用比较广泛的一个板块。

💫size

size函数计算元素总个数的。

咱们看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };cout << v1.size() << endl;cout << v1.capacity() << endl;return 0;
}

运行结果:

 💫max_size

size函数计算该对象最多容乃多少个元素

咱们看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v;cout << "该对象最多容乃多少个元素" << endl;cout << v.max_size() << endl;return 0;
}

运行结果:

 💫capacity

capacity函数作用是查看该对象的容量

咱们看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };cout << "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;cout << endl;return 0;
}

运行结果:

💫reserve和resize

reserve函数是扩容函数,可以增大capacity的值。

resize其实也是扩容函数,但resize改变的是size的值,当size的值增大时自动触发vector的扩容机制从而也增大了capacity的值。

resize在增带size值的时候还会对没有元素的位置初始化,如果没有指定初始化内容就默认初始化为空,而reserve不会进行初始化。

咱们看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };cout << "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;cout << endl;v1.reserve(25);cout << "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;cout << endl;v1.resize(50);cout << "size:" << v1.size() << endl;cout << "capacity:" << v1.capacity() << endl;cout << endl;return 0;
}

运行结果:

 💫empty

empty函数作用是查看该对象的内容是否为空

  • 有元素返回为0
  • 没有元素返回为1

咱们看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v1;cout << v1.empty() << endl;vector<int> v2{ 1 };cout << v2.empty() << endl;return 0;
}

运行结果:

🌙Element access(元素访问)

这个板块还是比较重要的,vector作用之一就是元素访问。

 💫operator[ ]

在vector中我们将操作符[ ]进行了重载,使其[ ]可以像数组那样通过下标来获取对应的元素和修改对应的元素。

 💫at函数

返回位置pos处的元素的引用。本质上还是一种遍历。

唯一与operator的区别就在于对于不合法的下标at会抛异常不会报错而[ ]会报错

咱们看看代码:

#include <iostream>
#include <vector>int main()
{std::vector<int> v1{ 1,2,3,4,5 };for (unsigned i = 0; i < v1.size(); ++i){std::cout << v1.at(i);}return 0;
}

运行结果:

🌙Modifiers(修改器)

在vector中修改器是十分重要的,大家务必多多练习,多多查看官网。

 💫assign函数

这个函数可以改变vector的容量和长度。

咱们看看代码:

#include <iostream>
#include <vector>int main()
{std::vector<int> first;std::vector<int> second;std::vector<int> third;first.assign(7, 100);             std::vector<int>::iterator it;it = first.begin() + 1;second.assign(it, first.end() - 1); int myints[] = { 1776,7,4 };third.assign(myints, myints + 3);   std::cout << "Size of first: " << int(first.size()) << '\n';std::cout << "Size of second: " << int(second.size()) << '\n';std::cout << "Size of third: " << int(third.size()) << '\n';return 0;
}

运行结果:

 💫push_back插入操作

将元素c追加到vector的末尾,使其长度增加一,也就是说push_back函数只能够尾插入一个元素,不能插入多个元素。

咱们看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };// 插入一个元素v1.push_back(10);for (auto ch : v1){cout << ch<< " ";}return 0;
}

运行结果:

 💫pop_back删除操作

擦除vector的最后一个元素,有效地将其长度减少一个,本质上可以实现vector对象的尾删操作。

 咱们看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };v1.pop_back();for (auto ch : v1){cout << ch<< " ";}return 0;
}

 运行结果:

 💫insert插入操作

insert函数可以在任意的指定位置进行插入。

咱们看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5 };for (auto ch : v1){cout << ch<< " ";}cout << endl;// 在下标为0的位置插入一个10vector<int>::iterator it1 = v1.begin();v1.insert(it1, 10);for (auto ch : v1){cout << ch << " ";}cout << endl;// 在下标为0的位置插入三个100vector<int>::iterator it2 = v1.begin() + 1;v1.insert(it2, 3, 100);for (auto ch : v1){cout << ch << " ";}cout << endl;return 0;
}

运行结果:

  💫erase删除操作

erase函数则可以做到在vector对象中的任意位置删除指定元素或者删除一段区间的元素。

咱们看看代码:

#include <iostream>
#include <vector>using namespace std;int main()
{vector<int> v1{ 1,2,3,4,5,6,7,8,9};for (auto ch : v1){cout << ch << " ";}cout << endl;// 删除一个元素vector<int>::iterator it1 = v1.begin();v1.erase(it1);for (auto ch : v1){cout << ch << " ";}cout << endl;// 删除一段元素vector<int>::iterator it2 = v1.begin();v1.erase(it2 + 1, v1.end() - 1);for (auto ch : v1){cout << ch << " ";}cout << endl;return 0;
}

运行结果:

 💫swap

clear函数是将全部的数据删除。

这里就不用代码演示了。

🌙Non-member function (非成员函数)

本来是不打算来讲解这块的,这里面只讲解swap,这个函数很容易搞混,在c++中有三个swap,每一个swap的作用都不一样,我们这里只讲解:

容器x的内容与y的内容交换。两个容器对象的类型必须相同(模板参数相同),但大小可能不同。

🌟结束语

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

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

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

相关文章

【面试总结】Java面试题目总结(一)

&#xff08;以下仅为个人见解&#xff0c;如果有误&#xff0c;欢迎大家批评并指出错误&#xff0c;谢谢大家&#xff09; 1.项目中的验证码功能是如何实现的&#xff1f; 第一步&#xff1a;在项目的pom.xml文件中导入 EasyCaptcha 的依赖&#xff1b; <dependency>…

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG

20231207给NanoPC-T4(RK3399)开发板刷Android12的挖掘机方案的LOG 2023/12/7 23:50 SDK&#xff1a;rk356x_android12_220722.tgz 只修改DTS的DTC部分就【直接】可以跑NanoPC-T4 参考资料&#xff1a; http://www.friendlyelec.com.cn/agent.asp http://www.friendlyelec.com.c…

实现安装“自由化”!在Windows 11中如何绕过“您尝试安装的应用程序未通过微软验证”

这篇文章描述了如果你不能安装应用程序,而是当你在Windows 11中看到消息“您尝试安装的应用程序未通过微软验证”时该怎么办。完成这些步骤将取消你安装的应用程序必须经过Microsoft验证的要求。 使用设置应用程序 “设置”应用程序提供了绕过此警告消息的最简单方法,以便你…

python简易学生管理 + MySQL

数据库表 Python代码部分 import pymysqlclass StMgmt(object):def tips(self):"""提示用户选择的操作"""print("""学生管理系统 1.01.查看所有信息2.查看学生信息3.修改学生信息4.增加学生信息5.退出学生系统"""…

【网络安全技术】传输层安全——SSL/TLS

一、TLS位置及架构 TLS建立在传输层TCP/UDP之上&#xff0c;应用层之下。 所以这可以解决一个问题&#xff0c;那就是为什么抓不到HTTP和SMTP包&#xff0c;因为这两个在TLS之上&#xff0c;消息封上应用层的头&#xff0c;下到TLS层&#xff0c;TLS层对上层消息整个做了加密&…

<JavaEE> 经典设计模式之 -- 单例模式(“饿汉模式”和“懒汉模式”实现单例模式)

目录 一、单例模式概述 二、“饿汉模式”实现单例模式 三、“懒汉模式”实现单例模式 3.1 单线程下的“懒汉模式” 3.2 多线程下的“懒汉模式” 一、单例模式概述 1&#xff09;什么是单例模式&#xff1f; 单例模式是一种设计模式。 单例模式可以保证某个类在程序中只存…

【Java数据结构 -- 顺序表】

List和ArrayList与顺序表 一. List1.1 List介绍2.1 常见接口介绍3.1 List的使用 二. ArrayList与顺序表1.线性表2.顺序表2.1 接口的实现2.2 顺序表的创建2.3 顺序表的打印2.4 顺序表的插入2.5 顺序表的按索引位置插入数据2.6 判断顺序表是否包含某个数2.7 返回顺序表某个数的索…

2023-12学习笔记

1.NonNull要手动写无参构造器 这是一个我今天研究了很久的问题&#xff0c;开始不知道原因是在这里&#xff0c;还在那想是不是Data覆盖了无参构造&#xff0c;结果当然不是。先说下解决历程 1.问题起因 通过RequestBody接收前端报文的时候报错&#xff0c;大致是说我构造方…

python中tkinter实现GUI程序:三个实例

python中tkinter实现GUI程序 写在最前面Python中使用Tkinter实现GUI程序的基本元素Tkinter简介基本元素1. 根窗口&#xff08;Root Window&#xff09;2. 小部件&#xff08;Widgets&#xff09;3. 布局管理4. 事件处理 1.用 tkinter实现一个简单的 GUI程序,单击“click”按钮&…

Java项目-瑞吉外卖Day3

填充公共字段&#xff1a; 目的&#xff1a;由于某些属性&#xff0c;例如createdTime这些需要填充的字段会在多个地方出现&#xff0c;所以考虑使用公共字段自动填充的办法减少重复代码。 在对应属性上加入TableField注解。通过fill字段表明策略&#xff0c;是插入/更新的时候…

如何搭建废品上门回收小程序

如今&#xff0c;随着环境保护意识的增强&#xff0c;废品的回收和再利用变得越来越重要。为了方便人们进行废品回收&#xff0c;搭建一个废品上门回收的小程序成为了一个不错的选择。本文将介绍如何从零开始搭建一个废品上门回收小程序。 …

【Go自学版】02-goroutine

利用时间片分割进程&#xff0c;致使宏观上A,B,C同时执行&#xff08;并发&#xff09; CPU利用率包含了执行和切换&#xff0c;进程/线程的数量越多&#xff0c;切换成本也会增大 最大并行数&#xff1a;GOMAXPROCS work stealing: 偷其他队列的G hand off: 当前G1阻塞&#…

css 修改滚动条样式,解决Windows浏览器中滚动条不美观问题

Windows环境中的浏览器中滚动条默认是直接显示了&#xff0c;不管光标是否进入该区域&#xff0c;这样就很不美观&#xff0c;如下图&#xff1a; 之前样式为 .well {display: block;background-color: #f2f2f2;border: 1px solid #ccc;margin: 5px;width: calc(100% - 12px);h…

mycat部署和配置读写分离(二)

说明&#xff1a; MyCAT 是使用 JAVA 语言进行编写开发&#xff0c;使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性&#xff0c;所以要求必须在 JDK7 以上的版本上运行。 1. jdk1.8安装 详见jdk环境安装 2. Mysql安装 详见mysql8.0.11源码安装…

【lesson11】数据类型之string类型

文章目录 数据类型分类string类型set类型测试 enum类型测试 string类型的内容查找找所有女生&#xff08;enum中&#xff09;找爱好有游泳的人&#xff08;set中&#xff09;找到爱好中有足球和篮球的人 数据类型分类 string类型 set类型 说明&#xff1a; set&#xff1a;集…

SL9008 3.6-60V输入 LED降压恒流芯片 内置MOS管 带PWM调光

SL9008是一款内置MOS管、具有PWM调光功能的LED降压恒流芯片&#xff0c;适用于3.6-60V的输入电压范围。它采用了先进的电路设计&#xff0c;确保了高效率和长寿命&#xff0c;同时具有宽电压输入范围和优异的负载调整率。 SL9008的主要特点包括&#xff1a; 1. 宽输入电压范围&…

HarmonyOS4.0开发应用——【ArkUI组件使用】

ArkUI组件使用 这里会详细演示以下组件使用: ImageTextTextInputButtonSliderColumn&&RowList自定义组件以及相关函数使用 Image 可以是网络图片、可以是本地图片、也可以是像素图 Image("https://ts1.cn.mm.bing.net/th?idOIP-C.cYA-_PINA-ND9OeBaolDTwHaHa&…

CLIP在Github上的使用教程

CLIP的github链接&#xff1a;https://github.com/openai/CLIP CLIP Blog&#xff0c;Paper&#xff0c;Model Card&#xff0c;Colab CLIP&#xff08;对比语言-图像预训练&#xff09;是一个在各种&#xff08;图像、文本&#xff09;对上进行训练的神经网络。可以用自然语…

鸿蒙HarmonyOS(ArkTS)语法 声明变量及注意事项

好 今天我们来看一个基础的harmonyOS语法 变量声明 这里 我们还是用 ArkTS项目 我们声明变量的语法并不是ArkTS的 而是 javaScript 和 TypeScript的 可以看一下下面一张图 js是最初弱类型语言 于是TS作为js的副类 是一种更严谨的数据限定语法 而ArkTS 是TS的改良版 其实我们…

一篇文章教你快速弄懂 web自动化测试中的三种等待方式

前言 现在的网页很多都是动态加载的&#xff0c;如果页面的内容发生了改变&#xff0c;就需要时间来渲染。在咱们做web自动化测试的时候&#xff0c;由于代码是自动执行的&#xff0c;代码在执行的时候&#xff0c;有可能上一步操作而加载的元素还没加载出来&#xff0c;就会报…