【C++】vector使用详解

本篇我们来介绍STL的vector的内容。vector其实就是顺序表,vector的学习还是分为接口使用和模拟实现两大部分,本片就是介绍一下vector的使用。
1.vector的介绍及使用
vector文档介绍:vector - C++ Reference 在使用时需要加头文件#include <vector>.
vector是一个标准的模板。不知道什么是模板去看【C++】模板(初识):函数模板、类模板-CSDN博客

第一个模板参数是要存的数据类型,第二个模板参数是一个空间配置器,就是一个内存池,现在不用关心他是什么。
我们在vector学习时一定要学会查文档。

string因为一些发展历史的原因,设计的接口比较多,比较冗余,vector相对来说就好很多,接口比string少很多。我们还是重点说经常使用的接口。
2.vector的构造函数、析构函数和operator=
构造函数


比如说下面的存int类型的顺序表。
vector<int> v1; //无参构造
vector<int> v2(10, 1); //10个1初始化
vector<int> v3(v2.begin(), v2.end());//迭代器区间初始化
vector<int> v4(++v2.begin(), --v2.end());//迭代器区间初始化

析构函数自动调用。


赋值运算符重载。


vector<int> v1; //无参构造
vector<int> v2(10, 1); //10个1初始化
vector<int> v3(v2.begin(), v2.end());//迭代器区间初始化
vector<int> v4(++v2.begin(), --v2.end());//迭代器区间初始化
v4 = v2; //v2,v4已存在,是赋值

3.vector的遍历
vector的遍历和string一样有三种方式:下标遍历、迭代器、范围for。这三种遍历详细的介绍在string类里面【C++】string类接口使用(万字详解)_sting怎么用-CSDN博客 第2.5节(string类对象的访问及遍历操作),不管是string还是vector,迭代器和范围for的用法都是一样的,类域不同而已,如果不清楚的建议先看string的2.5节。
3.1 下标遍历
vector<int> v2(10, 1); //10个1初始化
for (int i = 0; i < v2.size(); i++)
{cout << v2[i] << " ";
}
cout << endl;
因为vector也重载了operator[],所以也可以通过下标遍历。

3.2 迭代器

vector<int> v2(10, 1); //10个1初始化
vector<int>::iterator it = v2.begin();
while (it != v2.end())
{cout << *it << " ";++it;
}
cout << endl;
这里vector的迭代器要指定vector::类域,我们说string的迭代器的时候也是指定了string::类域。

反向迭代器和const迭代器就不演示了。
3.3 范围for
vector<int> v2(10, 1); //10个1初始化
for (auto e : v2)
{cout << e << " ";
}
cout << endl;

4.reserve
这个部分别的接口就不多说了,看一眼就知道是什么。我们来说一下reserve扩容。


用法大家都知道,我们看一下扩容机制,是不是一直按1.5倍扩。
void TestVectorExpandOP()
{vector<int> v;size_t sz = v.capacity();cout << "making bar grow:\n";for (int i = 0; i < 100; ++i){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed: " << sz << '\n';}}
}
int main()
{TestVectorExpandOP();return 0;
}
大概是1.5倍,有的地方做了特殊处理,比如向上取整,向下取整。
解决办法就是提前开空间,提前就开100个。
void TestVectorExpandOP()
{vector<int> v;size_t sz = v.capacity();v.reserve(100); // 提前将容量设置好,可以避免一遍插入一遍扩容cout << "making bar grow:\n";for (int i = 0; i < 100; ++i){v.push_back(i);if (sz != v.capacity()){sz = v.capacity();cout << "capacity changed: " << sz << '\n';}}
}

同样的,我们传n过去,编译器会开大于等于n的空间。
但是对于下面的第二种情况,string和vector处理方式不同。


5.resize
reserve是绝对不会改变size的,只会对capacity产生影响,但是resize会改变size,还会改变capacity。

第二个参数val传的话,多出来的所有都存为val。直接代码演示。
vector<int> v(10, 1);//10个1初始化
v.resize(5); //n<size情况

vector<int> v(10, 1);//10个1初始化
v.reserve(20);//开20个空间
//size < n < capacity,不传第二个参
v.resize(15);
vector<int> v(10, 1);//10个1初始化
v.reserve(20);//开20个空间
//size < n < capacity,传第二个参
v.resize(15, 2);

vector<int> v(10, 1);//10个1初始化
v.reserve(20);//开20个空间
//n > capacity,不传第二个参
v.resize(23);

vector<int> v(10, 1);//10个1初始化
v.reserve(20);//开20个空间
//n > capacity,传第二个参
v.resize(23, 2);

resize大概就是这样。
6.insert和erase

尾插和尾删就不多说了,这里说一下insert。

vector的insert不支持下标了,都是迭代器。
vector<int> v(10, 1);
v.insert(v.begin(), 2);//头插
v.insert(v.end(), 3);//尾插
vector<int> v(10, 1);
v.insert(v.begin(), 2);//头插
v.insert(v.end(), 3);//尾插
v.insert(v.begin() + 3, 4);//第3个位置插入
erase也不支持下标,只支持迭代器。

vector<int> v(10, 1);
v.insert(v.begin(), 2);//头插
v.insert(v.end(), 3);//尾插
v.insert(v.begin() + 3, 4);//第3个位置插入
v.erase(++v.begin());//删第2个位置数据

7.vector支持流插入和流提取吗?
不支持。我们会发现vector文档里面并没有重载<<和>>,因为vector的输入输出有很多不确定性。
这个要注意一下。
别的接口就不多说了,很多和string接口用法一致。所以一定要打好string的基础,vector学起来就比较轻松。【C++】string类接口使用(万字详解)_sting怎么用-CSDN博客

相关文章:
【C++】vector使用详解
本篇我们来介绍STL的vector的内容。vector其实就是顺序表,vector的学习还是分为接口使用和模拟实现两大部分,本片就是介绍一下vector的使用。 1.vector的介绍及使用 vector文档介绍:vector - C Reference 在使用时需要加头文件#include <…...
.NET Core WebApi第5讲:接口传参实现、数据获取流程、204状态码问题
一、接口传参实现 1、引入:通过网址上两个参数mod...和FID....,区分开要的是哪个板块里面的数据 2、传参实现:在方法的参数处定义STRING字符串 (1)传1个参数 2>运行代码,在网页上输入以“点…...
运维面试汇总
Linux grep sed awk cut组合使用☆ http错误码和原因 长连接、短连接、WebSocket区别和使用场景 nginx性能优化有哪些方式☆ lvs、nginx、haproxy区别和使用场景☆ 僵尸进程是什么 进程、线程、协程区别☆ 什么是nginx的异步非阻塞 linux网络丢包怎么排查☆ 常用的性能…...
学习封装Flutter组件,看这篇就够了
Flutter 的自定义组件 一、添加 UI 组件 在进行自定义组件的封装之前,应该先掌握如何在 Flutter 应用页面中添加内置组件,如按钮和文本等,以下面的页面定义为例: import package:flutter/material.dart;class SecondPage exten…...
无线麦克风方案芯片DSH32F3024
直播跑道狂飙后,与其相配套的产品链也逐渐成形。其中麦克风的发展更是随着直播的火热而直线上升。无线麦克风以其便捷性、灵活性和高质量的音频传输能力,更受大家的青睐。今天我们就来说一下无线麦克风及对它起着至关重要的主控芯片的技术特点和性能解析…...
谷粒商城の秒杀服务
文章目录 前言一、秒杀系统的设计二、缓存预热1.缓存结构设计2、上架 三、秒杀业务实现 前言 本篇基于谷粒商城的秒杀服务,介绍设计一个秒杀系统的要素,包括缓存预热、商品随机码、动静分离、消息队列削峰等。对应视频P311-P325(只介绍系统设…...
庆祝程序员节:聊一聊编程语言的演变
人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...
大模型技术在网络安全领域的应用与发展
一、概述 大模型技术,尤其是深度学习和自然语言处理领域的大型预训练模型,近年来在网络安全领域得到了广泛应用。这些模型通过其强大的数据处理能力和泛化能力,为网络安全带来了新的机遇和挑战。本文将对大模型技术在网络安全领域的应用进行…...
基于vite和vue3、 eslint、prettier、stylelint、husky规范
前言 在现代的前端开发中,代码规范非常重要。它可以提高团队的协作效率,减少代码错误,使代码更易于维护。为了实现代码规范化,我们可以使用一些工具来辅助我们的开发流程,包括eslint、prettier、stylelint、husky&am…...
git push到远程怎么回退
git push到远程服务器想继续修改,你必须要回退然后在此提交。而且需要保留本地的修改文件。 下面给你一些git命令,回退很简单。 按照下面的流程操作就行: 1.查看提交历史 首先,使用git log命令查看提交历史。可以使用以下命令显…...
Web保存状态的手段(Application的使用)
Application 在Java Web开发中,ServletContext(通常称为application)是一个非常重要的接口,它代表了Web应用程序的上下文。每个Web应用都有其自己的ServletContext,当Web应用被加载到Servlet容器时创建,并…...
高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架
【转载】理解图优化,一步步带你看懂g2o框架 文章来源:理解图优化,一步步带你看懂g2o框架 小白:师兄师兄,最近我在看SLAM的优化算法,有种方法叫“图优化”,以前学习算法的时候还有一个优化方法…...
Flutter Row组件实战案例
In this section, we’ll continue our exploration by combining the Row and Container widgets to create more complex layouts. Let’s dive in! 在本节中,我们将继续探索,结合“Row”和“Container”小部件来创建更复杂的布局。让我们开始吧! Sc…...
【ubuntu20.04】【ROS Noetic】【ROS安装】【Website may be down.】【gpg: 找不到有效的 OpenPGP 数据。】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、登入www.ros.org1.Setup your sources.list2.Set up your keys中间出了点问题 gpg: 找不到有效的 OpenPGP 数据。4.Installation下载安装ros5.环境参数的配…...
Python开发必备,这些黑科技库你get到了吗
大家好,今天我要为大家推荐一些非常强大和实用的Python库,相信无论是Python新手还是老司机,都能从中受益,提升你的Python开发技能。那就一起来看看吧! 1.Requests: 简单好用的HTTP请求库 第一个要介绍的是Requests库。它是Python中最流行的HTTP客户端库之一,大大简化了网络请…...
sublime text 常用快捷键
sublimetext常用快捷键 CtrlShiftP:打开命令面板 CtrlP:搜索项目中的文件 CtrlG:跳转到第几行 CtrlW:关闭当前打开文件 CtrlShiftW:关闭所有打开文件 CtrlShiftV:粘贴并格式化 CtrlD:选择单词&a…...
Kubernetes(K8S) + Harbor + Ingress 部署 SpringBoot + Vue 前后端分离项目
文章目录 1、环境准备2、搭建 K8S3、搭建 Harbor4、搭建 MySQL5、构建 SpringBoot 项目镜像6、构建 Vue.js 项目镜像7、部署项目7.1、配置 NameSpace7.2、配置 Deployment、Service7.3、配置 Ingress-Nginx7.4、访问测试 1、环境准备 本次整体项目部署使用的是阿里云ECS服务器…...
【iOS】知乎日报第一周总结
知乎日报第一周总结 文章目录 知乎日报第一周总结前言网络异步导致视图无法加载加载网络上的图片实现一个上拉刷新的效果左上角的时间初步实现了点击cell进入网页小结 前言 笔者在本周算是正式开始写项目了,本周主要是大致完成了主页的内容,大致完成了主…...
Springboot整合spring-boot-starter-data-elasticsearch
前言 <font style"color:rgb(36, 41, 47);">spring-boot-starter-data-elasticsearch</font> 是 Spring Boot 提供的一个起始依赖,旨在简化与 Elasticsearch 交互的开发过程。它集成了 Spring Data Elasticsearch,提供了一套完整…...
【大模型系列】mPLUG-Owl3(2024.08)
Paper: https://arxiv.org/pdf/2408.04840Github: https://github.com/X-PLUG/mPLUG-OwlHuggingFace:https://huggingface.co/mPLUG/mPLUG-Owl3-7B-240728Author: Jiabo Ye et al. 阿里巴巴 文章目录 0 总结(省流版)1 模型结构1.1 Cross-attention Based Achitectur…...
iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
