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,一经查实,立即删除!

相关文章

UVM中的config_db机制传递interface

&#xff08;1&#xff09;定义interface interface my_if(input clk, input rst_n);logic [7:0] data;logic valid;endinterface &#xff08;2&#xff09;在tb中使用interface 定义了interface后&#xff0c;在top_tb中实例化DUT时&#xff0c;就可以直接使用。 先…

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

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

软件崩溃时Visual Studio中看不到有效的调用堆栈,使用Windbg动态调试去分析定位

目录 1、问题说明 2、使用Windbg查看崩溃时详细的函数调用堆栈

SQL命令---修改字段名

介绍 使用sql语句修改字段名。 命令 alter table 表名 change 旧字段名 新字段名 新数据类型;例子 将a表id字段名改为id1 alter table a change id id1 int(12) NOT NULL;

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…

[python高级编程]:01-数据结构

此系列主要用于记录Python学习过程中查阅的优秀文章&#xff0c;均为索引方式。其中内容只针对本作者一人&#xff0c;作者熟悉了解的内容不再重复记录。 目录 01-列表推导式 列表推导同filter和map的比较 02-元组 元组拆包 具名元组 01-列表推导式 列表推导同filter和map的比…

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

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

Windows10下MySQL5.7.31解压版安装与卸载

一、安装 1进入官网下载MySQL5.7.31解压版&#xff1a; MySQL :: Download MySQL Community Server (Archived Versions) 2解压文件 解压目录到D:\developer_tools\MySQL\mysql-5.7.31-winx64&#xff0c;在bin同级目录下创建my.ini文件&#xff0c;写入以下代码&#xff1…

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层对上层消息整个做了加密&…

数的划分(递归)

题目名字 数的划分 题目链接 题意 给数字n&#xff0c;讲数字n分为m份&#xff0c;共有多少种分法&#xff0c;不能重复&#xff0c;分成一样的数字也不行 思路 看到这种分数字的先化成有多少个球要分到多少个篮子里去再想两个分法并且加起来&#xff0c;一个是每个篮子最多只…

<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 返回顺序表某个数的索…

Java 22种设计模式详解

22种设计模式详解 创建型模式单例模式工厂方法模式抽象工厂模式建造者模式原型模式 结构型模式适配器模式桥接模式组合模式装饰器模式代理模式外观模式享元模式享元模式原理&#xff1a;享元模式角色&#xff1a;示例代码&#xff1a; 行为型模式模板方法模式原理角色示例代码命…

UEFI 学习笔记

引言 相比于Windows/MacOS/Linux等主流的操作系统,大部分人对于固件BIOS(Basic Input & Output System)并不熟悉,它诞生于1981年出产的第一代个人计算机IBM PC,在那时工程师将硬件检测代码、最基本的外围设备I/O处理程序和操作系统引导程序代码写入仅有32KB大小的PRO…

(1)(1.4) ESP32 wifi telemetry

文章目录 前言 1 用于ESP32的DroneBridge 2 推荐的硬件 3 下载和烧录固件 4 为ESP32配置DroneBridge 前言 ESP32 是现成的 Wi-Fi 模块&#xff0c;具有完整的 TCP/IP 协议栈和微控制器功能。它们提供专用的 UART、SPI 和 I2C 接口。它们可与任何 ArduPilot 自动驾驶控制器…

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”按钮&…

项目方看过来,详解Moonbeam Grants申请技巧

Grants加速计划是Moonbeam基金会发起的生态资助计划&#xff0c;旨在支持生态系统中的不同项目、社区和个人&#xff0c;帮助他们顺利进入Moonbeam发展&#xff0c;依靠早期的生态扶持迅速成长。 每一份Grant计划旨在融合社区参与、包容性和透明度等特性&#xff0c;加速Moonb…

Java项目-瑞吉外卖Day3

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