【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…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
41道Django高频题整理(附答案背诵版)
解释一下 Django 和 Tornado 的关系? Django和Tornado都是Python的web框架,但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计。它遵循MVC设计,并强调代码复用。Django有…...
Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...
基于Uniapp的HarmonyOS 5.0体育应用开发攻略
一、技术架构设计 1.混合开发框架选型 (1)使用Uniapp 3.8版本支持ArkTS编译 (2)通过uni-harmony插件调用原生能力 (3)分层架构设计: graph TDA[UI层] -->|Vue语法| B(Uniapp框架)B --&g…...
