当前位置: 首页 > news >正文

【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其实就是顺序表&#xff0c;vector的学习还是分为接口使用和模拟实现两大部分&#xff0c;本片就是介绍一下vector的使用。 1.vector的介绍及使用 vector文档介绍&#xff1a;vector - C Reference 在使用时需要加头文件#include <…...

.NET Core WebApi第5讲:接口传参实现、数据获取流程、204状态码问题

一、接口传参实现 1、引入&#xff1a;通过网址上两个参数mod...和FID....&#xff0c;区分开要的是哪个板块里面的数据​​​​​ 2、传参实现&#xff1a;在方法的参数处定义STRING字符串 &#xff08;1&#xff09;传1个参数 2>运行代码&#xff0c;在网页上输入以“点…...

运维面试汇总

Linux grep sed awk cut组合使用☆ http错误码和原因 长连接、短连接、WebSocket区别和使用场景 nginx性能优化有哪些方式☆ lvs、nginx、haproxy区别和使用场景☆ 僵尸进程是什么 进程、线程、协程区别☆ 什么是nginx的异步非阻塞 linux网络丢包怎么排查☆ 常用的性能…...

学习封装Flutter组件,看这篇就够了

Flutter 的自定义组件 一、添加 UI 组件 在进行自定义组件的封装之前&#xff0c;应该先掌握如何在 Flutter 应用页面中添加内置组件&#xff0c;如按钮和文本等&#xff0c;以下面的页面定义为例&#xff1a; import package:flutter/material.dart;class SecondPage exten…...

无线麦克风方案芯片DSH32F3024

直播跑道狂飙后&#xff0c;与其相配套的产品链也逐渐成形。其中麦克风的发展更是随着直播的火热而直线上升。无线麦克风以其便捷性、灵活性和高质量的音频传输能力&#xff0c;更受大家的青睐。今天我们就来说一下无线麦克风及对它起着至关重要的主控芯片的技术特点和性能解析…...

谷粒商城の秒杀服务

文章目录 前言一、秒杀系统的设计二、缓存预热1.缓存结构设计2、上架 三、秒杀业务实现 前言 本篇基于谷粒商城的秒杀服务&#xff0c;介绍设计一个秒杀系统的要素&#xff0c;包括缓存预热、商品随机码、动静分离、消息队列削峰等。对应视频P311-P325&#xff08;只介绍系统设…...

庆祝程序员节:聊一聊编程语言的演变

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…...

大模型技术在网络安全领域的应用与发展

一、概述 大模型技术&#xff0c;尤其是深度学习和自然语言处理领域的大型预训练模型&#xff0c;近年来在网络安全领域得到了广泛应用。这些模型通过其强大的数据处理能力和泛化能力&#xff0c;为网络安全带来了新的机遇和挑战。本文将对大模型技术在网络安全领域的应用进行…...

基于vite和vue3、 eslint、prettier、stylelint、husky规范

前言 在现代的前端开发中&#xff0c;代码规范非常重要。它可以提高团队的协作效率&#xff0c;减少代码错误&#xff0c;使代码更易于维护。为了实现代码规范化&#xff0c;我们可以使用一些工具来辅助我们的开发流程&#xff0c;包括eslint、prettier、stylelint、husky&am…...

git push到远程怎么回退

git push到远程服务器想继续修改&#xff0c;你必须要回退然后在此提交。而且需要保留本地的修改文件。 下面给你一些git命令&#xff0c;回退很简单。 按照下面的流程操作就行&#xff1a; 1.查看提交历史 首先&#xff0c;使用git log命令查看提交历史。可以使用以下命令显…...

Web保存状态的手段(Application的使用)

Application 在Java Web开发中&#xff0c;ServletContext&#xff08;通常称为application&#xff09;是一个非常重要的接口&#xff0c;它代表了Web应用程序的上下文。每个Web应用都有其自己的ServletContext&#xff0c;当Web应用被加载到Servlet容器时创建&#xff0c;并…...

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(十二)拓展图优化库g2o(一)框架

【转载】理解图优化&#xff0c;一步步带你看懂g2o框架 文章来源&#xff1a;理解图优化&#xff0c;一步步带你看懂g2o框架 小白&#xff1a;师兄师兄&#xff0c;最近我在看SLAM的优化算法&#xff0c;有种方法叫“图优化”&#xff0c;以前学习算法的时候还有一个优化方法…...

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! 在本节中&#xff0c;我们将继续探索&#xff0c;结合“Row”和“Container”小部件来创建更复杂的布局。让我们开始吧! Sc…...

【ubuntu20.04】【ROS Noetic】【ROS安装】【Website may be down.】【gpg: 找不到有效的 OpenPGP 数据。】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、登入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&#xff1a;打开命令面板 CtrlP&#xff1a;搜索项目中的文件 CtrlG&#xff1a;跳转到第几行 CtrlW&#xff1a;关闭当前打开文件 CtrlShiftW&#xff1a;关闭所有打开文件 CtrlShiftV&#xff1a;粘贴并格式化 CtrlD&#xff1a;选择单词&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进入网页小结 前言 笔者在本周算是正式开始写项目了&#xff0c;本周主要是大致完成了主页的内容&#xff0c;大致完成了主…...

Springboot整合spring-boot-starter-data-elasticsearch

前言 <font style"color:rgb(36, 41, 47);">spring-boot-starter-data-elasticsearch</font> 是 Spring Boot 提供的一个起始依赖&#xff0c;旨在简化与 Elasticsearch 交互的开发过程。它集成了 Spring Data Elasticsearch&#xff0c;提供了一套完整…...

【大模型系列】mPLUG-Owl3(2024.08)

Paper: https://arxiv.org/pdf/2408.04840Github: https://github.com/X-PLUG/mPLUG-OwlHuggingFace&#xff1a;https://huggingface.co/mPLUG/mPLUG-Owl3-7B-240728Author: Jiabo Ye et al. 阿里巴巴 文章目录 0 总结(省流版)1 模型结构1.1 Cross-attention Based Achitectur…...

STK Target Sequence实战:不写一行代码,30分钟搞定卫星初始轨道参数优化

STK Target Sequence实战&#xff1a;不写一行代码&#xff0c;30分钟搞定卫星初始轨道参数优化 在航天任务规划中&#xff0c;轨道设计往往是项目初期最耗时的环节之一。传统方法需要工程师反复调整参数、运行仿真、分析结果&#xff0c;整个过程可能持续数小时甚至数天。而ST…...

ROFL Player终极指南:英雄联盟回放分析工具完整使用教程

ROFL Player终极指南&#xff1a;英雄联盟回放分析工具完整使用教程 【免费下载链接】ROFL-Player (No longer supported) One stop shop utility for viewing League of Legends replays! 项目地址: https://gitcode.com/gh_mirrors/ro/ROFL-Player 还在为英雄联盟回放…...

从零到一:手把手教你完成Matlab R2020a的下载、安装与激活【避坑指南】

1. 准备工作&#xff1a;下载与系统检查 第一次安装Matlab的朋友们可能会被复杂的流程吓到&#xff0c;但别担心&#xff0c;跟着我的步骤走绝对没问题。我去年给实验室十几台电脑装过R2020a版本&#xff0c;踩过的坑比你们见过的都多。首先咱们得准备好安装包&#xff0c;这里…...

从登录到支付:手把手教你用RSA签名验签保护Spring Boot API接口安全

从登录到支付&#xff1a;Spring Boot API接口的RSA签名验签实战指南 在数字化业务高速发展的今天&#xff0c;API接口安全已成为系统设计的核心议题。想象这样一个场景&#xff1a;用户通过移动端提交登录请求&#xff0c;黑客在传输过程中篡改了密码字段&#xff1b;或是支付…...

AwesomeQRCode源码阅读笔记:深入理解二维码渲染核心技术

AwesomeQRCode源码阅读笔记&#xff1a;深入理解二维码渲染核心技术 【免费下载链接】AwesomeQRCode An awesome QR code generator for Android. 项目地址: https://gitcode.com/gh_mirrors/aw/AwesomeQRCode 想要为你的Android应用添加炫酷的二维码生成功能吗&#xf…...

Java 判断选择循环

一、判断1.应用场景&#xff1a;只有满足条件&#xff0c;对应的代码才能执行2.三种形式&#xff1a;3.示例&#xff1a;4.注意事项&#xff1a;二、选择1.使用&#xff1a;把所有的选择一一列举出来&#xff0c;根据不同的条件任选其一2.格式&#xff1a;3.示例&#xff1a;4.…...

AI编码助手安全护栏:Claude代码生成规则引擎实战指南

1. 项目概述&#xff1a;为AI编码助手装上“护栏”最近在折腾AI辅助编程&#xff0c;特别是用Claude这类大模型来写代码&#xff0c;效率提升确实明显。但用久了就会发现一个问题&#xff1a;模型生成的代码&#xff0c;有时候会“放飞自我”。比如&#xff0c;它可能会引入一些…...

极简终端AI聊天工具gptcli:单文件Python脚本实现OpenAI API兼容客户端

1. 项目概述&#xff1a;一个极简的终端AI聊天工具如果你和我一样&#xff0c;经常需要在终端里和AI模型对话&#xff0c;但又觉得官方网页版太重、第三方客户端功能太杂&#xff0c;那么这个项目可能就是你的菜。gptcli是一个用单个Python脚本实现的、功能纯粹的终端聊天客户端…...

Weaviate官方示例库全解析:从向量数据库入门到AI应用实战

1. 项目概述&#xff1a;一个向量数据库的“游乐场”如果你最近在折腾大语言模型应用&#xff0c;或者想给自己的数据加上一个智能的“记忆大脑”&#xff0c;那你大概率已经听说过向量数据库了。在众多选择中&#xff0c;Weaviate 以其开源、易用和强大的功能&#xff0c;成为…...

从零构建AI编程助手:Groundhog项目解析与Rust实现

1. 项目概述&#xff1a;一个从零开始理解AI编程助手的教学项目如果你和我一样&#xff0c;对Cursor、GitHub Copilot这类AI编程助手背后的工作原理感到好奇&#xff0c;甚至有点“黑盒”恐惧&#xff0c;那么这个叫Groundhog的项目&#xff0c;可能就是为你量身打造的。它不是…...