【C++】STL---vector基本用法介绍

个人主页:平行线也会相交💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】💌
本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍
希望我们一起努力、成长,共同进步。🍓
在这里插入图片描述

vectorC++STL中的一种动态数组容器,用于存储和操作一系列的元素。
同时vector提供了灵活的大小调整、随机访问、连续存储、动态内存管理等特点。

注意使用vector前需要包含头文件#include<vector>
下面将对vector的常用语法作出详细的介绍。

目录

  • 一、vector初始化
    • 1.1一般初始化方式
    • 1.2利用迭代器进行初始化
    • 1.3利用数组指针进行初始化
  • 二、vector的增删查改
    • 2.1增添元素-push_back()
    • 2.2删除元素-erase()
    • 2.3某个位置插入元素-insert()
    • 2.4查找-find()
  • 三、vector迭代器的使用(iterator)
    • 3.1遍历容器元素
  • 四、vector容器的常用算法
    • 4.1排序
  • 五、vector容量操作
    • 5.1reserve
      • 错误案例演示
    • 5.2resize

一、vector初始化

1.1一般初始化方式

例1:创建一个具有5个整型元素的向量

//v1是一个具有5个int类型元素大小的向量
vector<int> v1(5);

例2:创建一个具有5个int类型元素大小的向量,并要将每个元素初始化成0。

//v2是一个具有5个int类型元素大小的向量,其中每个元素都是0
vector<int> v2(5, 0);

在这里插入图片描述

例3:创建5个string类型的向量,并完成初始化操作。

vector<string> v(5, "C++");

在这里插入图片描述

1.2利用迭代器进行初始化

例1:利用相同类型的迭代器进行初始化。

利用相同类型的迭代器进行初始化
vector<int> v1(10, 1);
vector<int> v2(v1.begin(), v1.end());
for (auto e : v2)
{cout << e << " ";
}

例2:利用不同类型的迭代器进行初始化。

//利用不同类型的迭代器进行初始化
string str("hello C++");vector<int> v3(str.begin(), str.end());
vector<char> v4(str.begin(), str.end());for(auto e : v3)cout << e << " ";
cout << endl;
for (auto e : v4)cout << e << " ";
cout << endl;

在这里插入图片描述

1.3利用数组指针进行初始化

//利用数组指针进行初始化
int a[] = { 1,2,3,4 };
vector<int> v5(a, a + 4);

在这里插入图片描述

二、vector的增删查改

2.1增添元素-push_back()

方法1:使用成员函数push_back()

vector<int> v3;v3.push_back(1);v3.push_back(2);v3.push_back(3);v3.push_back(4);

在这里插入图片描述
方法2:使用for循环进行赋值

vector<int> v4;
for (int i = 0; i < 10; i++)v4.push_back(i);

在这里插入图片描述

2.2删除元素-erase()

int a[] = { 1,3,5,7,9 };
vector<int> v(a, a + 5);
for (auto e : v)
{cout << e << " ";
}
cout << endl;//删除第一个位置的值
v.erase(v.begin());
for (auto e : v)
{cout << e << " ";
}
cout << endl;//删除第三个位置的值
v.erase(v.begin()+2);
for (auto e : v)
{cout << e << " ";
}
cout << endl;

在这里插入图片描述

2.3某个位置插入元素-insert()

在这里插入图片描述

int a[] = { 1,3,5,7,9 };
vector<int> v(a, a + 5);
for (auto e : v)
{cout << e << " ";
}
cout << endl;v.insert(v.begin(), 100);
for (auto e : v)
{cout << e << " ";
}
cout << endl;

在这里插入图片描述

2.4查找-find()

这里需要注意的是:

虽然vector容器本身没有直接提供查找函数即find的成员函数,但通过包含<algorithm>头文件,你可以使用find算法函数来在vector中查找元素。这是因为标准库提供了一种通用的查找函数,可以在各种容器中使用。

举个例子:

//查找元素
int a[] = { 0,2,4,6,8,10,12 };
vector<int> v(a, a + sizeof(a) / sizeof(a[0]));
for (auto e : v)
{cout << e << " ";
}
cout << endl;vector<int>::iterator pos = find(v.begin(), v.end(), 8);
if (pos != v.end())v.erase(pos);
for (auto e : v)
{cout << e << " ";
}
cout << endl;

在这里插入图片描述

三、vector迭代器的使用(iterator)

3.1遍历容器元素

vector<int> v5;v5.push_back(1);v5.push_back(2);v5.push_back(3);vector<int>::iterator it = v5.begin();while (it != v5.end()){cout << *it << " ";it++;}

在这里插入图片描述

四、vector容器的常用算法

我们知道,容器可以用来存储数据,而算法就是对数据进行处理。通过容器也能能够访问其中存储的数据,所以我们可以通过容器来实现一些常用的算法。例如一些查找的算法、排序的算法。

4.1排序

例1:升序。

//升序
int a[] = { 15,9,29,3,50 };
vector<int> v(a, a + 5);
sort(v.begin(), v.end());
//sort(v.rbegin(), v.rend());使用反向迭代器,此时为降序
for (auto e : v)cout << e << " ";
cout << endl;

例2:降序。

greater<int> g;
sort(v.begin(), v.end(), g);
//sort(v.rbegin(), v.rend());使用反向迭代器,此时为升序
for (auto e : v)cout << e << " ";
cout << endl; 

降序这里我们其实没有必要传greater<int> g这个有名对象,这里完全可以用匿名对象来实现。
sort(v.begin(), v.end(), greater<int>());

在这里插入图片描述

例3:对string类型的对象进行排序。

string str("hello world");
sort(str.begin(), str.end());
cout << str << endl;

在这里插入图片描述

五、vector容量操作

5.1reserve

reserve函数用于预留一定的容量空间,以提高向vector中添加元素的效率。它通常在你知道vector将存储大量元素时使用,可以避免不必要的重新分配和复制元素。

这里有一点非常重要调用reserve函数不会改变vector的大小(即size()的返回值),只会影响vector的容量(即capacity()的返回值)。

错误案例演示

下面举一个错误案例

//这是一个错误案例
vector<int> v1;
v1.reserve(10);
for (size_t i = 0; i < 10; i++)
{v1[i] = i;
}

v1[i] = i中的[]操作会先对size进行检查,即assert(i < _size);。而上述代码中的size是0,执行完v1.reserve(10);之后只是改变了capacity,并不会对size进行改变。经过assert(i < _size);的检查之后当然会报错了。

但是如果我们依然要使用reserve的话,我们应该这样去使用,请看:

vector<int> v;
v.reserve(10);
for (size_t i = 0; i < 10; i++)
{v.push_back(i);cout << v[i];
}

在这里插入图片描述

5.2resize

resize函数用于改变vector的大小(即改变size),可以增加或减少元素的数量。当增加大小时,新的元素会使用默认值进行初始化。

调用vector的resize函数会同时改变size和capacity

vector<int> v1;
v1.resize(10);
for (size_t i = 0; i < 10; i++)
{v1[i] = i;
}for (auto e : v1)
{cout << e << " ";
}
cout << endl;

在这里插入图片描述
在这里插入图片描述

关于reserve函数和resize函数要时刻注意sizecapacity的变化。开辟了空间(capacity)后不一定可以对其内容进行访问,因为有时可能会对size的大小进行检查,比如[]

好了,以上就是本文的全部内容,主要对vector的一些基本语法和用法进行了介绍。
就到这里吧,再见啦友友们!!!

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

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

相关文章

设计模式之代理模式

写在前面 1&#xff1a;介绍 1.1&#xff1a;什么时候使用代理模式 当我们有对象因为安全性&#xff0c;不能直接对外暴露&#xff0c;或者是需要对对象的操作本身记录日志等信息时就可以考虑使用代理模式&#xff0c; 1.2&#xff1a;UML类图 享元设计模式&#xff0c;包…

五十、Spring

1.Spring概述 1.1 Spring是什么 Spring是分层的 Java SE/EE应用 full-stack(全栈式) 轻量级开源框架。 提供了表现层 SpringMVC和持久层 Spring JDBC Template以及 业务层 事务管理等众多的企业级应用 技术&#xff0c;还能整合开源世界众多著名的第三方框架和类库&#xf…

4个顶级WooCommerce商城多站点库存同步WordPress插件

经营几家网上商店是令人兴奋的。但是&#xff0c;这也是一项艰巨的工作&#xff0c;尤其是当您意识到需要同步这些商店的库存时。好消息是&#xff0c;有 WooCommerce 多站点库存同步插件和选项可以加快速度。 WooCommerce 多站点网络可让您将所有在线商店无缝地安置在一个屋檐…

【Tauri + React 实战】VCluster - 了解技术选型与开发环境配置

VCluster A React Tauri App as visualizer of apps cluster on windows. 背景介绍 VCluster是一个在开发环境下&#xff0c;用以对一系列应用集群&#xff08;如分布式、微服务&#xff09;进行可视化管理的桌面应用程序&#xff0c;目标是实现类似 docker-compose 那样的集…

TabBar和TabBarView实现顶部滑动导航

home.dart子页面主要代码&#xff1a; import package:flutter/material.dart;class HomePage extends StatefulWidget {const HomePage({super.key});overrideState<HomePage> createState() > _HomePageState(); }class _HomePageState extends State<HomePage&…

windows环境hadoop报错‘D:\Program‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

Hadoop版本为2.7.3&#xff0c;在环境配置好后&#xff0c;检查hadoop安装版本&#xff0c;报如标题所示错误&#xff0c;尝试网上主流的几种方法均无效。 错误&#xff1a;windows环境hadoop报错’D:\Program’ 不是内部或外部命令,也不是可运行的程序 或批处理文件。 错误方…

TCP/IP网络编程 第十一章:进程间通信

进程间通信的基本概念 在上一章中我们讲到&#xff0c;进程自身有独立的内存空间&#xff0c;进程之间是相互独立的存在。因此在没有任何机制的支持下&#xff0c;我们可以将进程看作相互孤立的存在。 但是进程之间在某种程度上也是要“交流”的&#xff0c;下面正式介绍进程…

在uni中使用vue3写h5的pdf导出

先安装依赖 npm install --save html2canvas npm install jspdf --save 把dom转canvas&#xff0c;屏幕截图基于 DOM&#xff0c;因此可能不是 100% 准确到真实表示&#xff0c;因为它不会制作实际的屏幕截图&#xff0c;而是根据页面上可用的信息构建屏幕截图。 components…

linux 一键安装docker docker-compose

# 环境 deploy.sh docker-19.03.9.tgz docker-compose-linux-x86_64 tar -zxvf docker-19.03.9.tgz mv docker-19.03.9 docker cp docker/* /usr/bin/ touch /etc/systemd/system/docker.service cat << EOG > /etc/systemd/system/docker.service [Unit] Descripti…

【技巧】Maven重复依赖分析查找

【技巧】Maven重复依赖分析查找 遇到奇葩的错误可以考虑是不是依赖冲突了 比如同一段代码 再这个项目中好好的 另一个项目中不能用等 idea安装插件 maven helper 打开pom文件 输入要查找的依赖 将不用的排除掉 右键排除即可

“深入解析API接口:原理、用途和最佳实践“

API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是不同软件或系统之间进行交互的桥梁&#xff0c;它提供了一组定义好的规则和功能&#xff0c;使得不同的应用程序能够相互通信和交换数据。API接口的理解、应用和最佳实践对于开发者…

在阿里云平台注册一个域名

我们访问阿里云官网 阿里云 然后 我们右上角点击登录 然后 按正常操作流程登录 登录成功后 我们点击控制台 我们将鼠标 移入 右上角 图片指向的位置 我们点击域名 进入界面后点击注册域名 在输入框中输入域名内容 然后 按回车 然后弹出的列表 我们可以选一个未注册的 点击…

解决Linux打开文件数过多error:too many open files

解决Linux打开文件数过多error:too many open files #查看当前的最大打开文件数 ulimit -n #默认只有1024,当负载较大的服务器时&#xff0c;很容易遇到error: too many open files。因此&#xff0c;需要将其改大。#可临时修改&#xff0c;但重启后就无效 ulimit -n 65535 #查…

Druid-排查conditionDoubleConstAllow配置问题(double const condition)

Druid-排查conditionDoubleConstAllow配置问题(double const condition) 报错信息 Caused by: java.sql.SQLException: sql injection violation, dbType postgresql, druid-version 1.2.18, double const condition : SELECT * FROM test where 11 AND TRUE AND TRUE关键词&…

正则表达式概念以及语法的使用

目录 1.概念 2. 为什么使用正则表达式&#xff1f; 3. 语法 1.普通字符 非打印字符 2. 特殊字符 3. 限定符 4. 定位符 5. 运算优先级 3.匹配规则 1. 基本模式匹配 2. 字符簇 3. 确定重复出现 1.概念 正则表达式(Regular Expression)是一种文本模式&#xff0c;包…

【Docker】docker-compose基本使用

【Docker】docker-compose基本使用 文章目录 【Docker】docker-compose基本使用1. docker 项目部署弊端2. docker-compose 简介3. 实践4. 模板命令4.1 build 指令4.2 command 指令4.3 container_name 指令4.4 depends_on 指令4.5 env_file 指令4.6 environment 指令4.7 image 指…

基于Redisson的Redis分布式锁

Redisson分布式锁_redissonclient_甩锅虾的博客-CSDN博客 *** 分布式锁*/ public interface DistributedLock {/*** 尝试获取锁* param lockName* param seconds* return*/Boolean tryAcquire(String lockName, long seconds, TimeUnit unit);/*** 释放锁* param lockKey*/v…

如何使用自动化构造随机路由模型

为什么要仿真随机路由&#xff1f; 路由器测试中&#xff0c;为了最大程度还原现网路由情况&#xff0c;评估路由器在现网环境下稳定工作各项指标&#xff0c;需要对导入路由进行离散仿真&#xff0c;目前路由仿真可分为导入路由与生成路由两种方式&#xff0c;导入路由需要现…

vue如何使用webscorket实现多人协同在线表格填写

要使用WebSocket在Vue中实现多人协同在线表格填写&#xff0c;你可以按照以下步骤进行操作&#xff1a;1. 安装WebSocket库&#xff1a;首先&#xff0c;在Vue项目中安装WebSocket库。你可以使用 socket.io-client 库来处理WebSocket通信。使用npm或yarn安装它&#xff1a;npm …

学习遇上的一点补救

从开始学习java到现在逐步确定好发展路线。是时候停一下步伐了。 之前不停的往前走&#xff0c;从学校的课程、书本开始&#xff0c;没有借助网课、视频&#xff0c;依靠自己一步一个脚印。从Java实用程序、Javaweb、JavaEE然后选择MySQL数据库、然后觉得有必要对前端了解&…