【C++】一文带你走入vector

news2024/11/18 3:50:03

文章目录

  • 一、vector的介绍
  • 二、vector的常用接口说明
    • 2.1 vector的使用
    • 2.2 vector iterator的使用
    • 2.3 vector空间增长问题
    • 2.4 vector 增删查改
  • 三、总结


ヾ(๑╹◡╹)ノ" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)ノ"
在这里插入图片描述


一、vector的介绍

vector文档介绍 大部分的使用与string的使用类似
vector类似于顺序表,是动态增长的数组。头文件:#include < vector >

  1. vector是表示可变大小数组的序列容器。
  2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。
  3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。
  4. vector分配空间策略:vector会分配一些额外的空间以适应可能的增长,因为存储空间比实际需要的存储空间更大。不同的库采用不同的策略权衡空间的使用和重新分配。但是无论如何,重新分配都应该是对数增长的间隔大小,以至于在末尾插入一个元素的时候是在常数时间的复杂度完成的。
  5. 因此,vector占用了更多的存储空间,为了获得管理存储空间的能力,并且以一种有效的方式动态增长。
  6. 与其它动态序列容器相比(deque, list and forward_list),vector在访问元素的时候更加高效,在末尾添加和删除元素相对高效。对于其它不在末尾的删除和插入操作,效率更低。比起list和forward_list统一的迭代器和引用更好

二、vector的常用接口说明

2.1 vector的使用

在这里插入图片描述
vector可以存储任意类型的数据
代码展示:

	vector<int> v1;//可以是int类型,也可以是任意类型
	v1.push_back(1);
	v1.push_back(2);
	v1.push_back(3);

	vector<string> v2;//可以是string类型
	v2.push_back("易烊千玺");
	v2.push_back("王俊凯");
	v2.push_back("王源");

	vector<int> v3;
	v3 = v1;

	vector<double> v4(10, 1.2);//10个1.2进行初始化
	//可以迭代器区间进行初始化
	vector<string> v5(++v2.begin(), v2.end());
	//从v2的第二个到最后一个,对v5进行初始化

	string s = "hello world";
	vector<char> v6(s.begin(), s.end());
	//可以是任意类型的迭代器,不一定是自已类型的迭代器

注意:allocator是空间配置器,其实就是内存池。空间配置器也可以自己写。
在这里插入图片描述

2.2 vector iterator的使用

在这里插入图片描述

vector的遍历

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	//vector的遍历
	//1.[]
	for (size_t i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
	//2.迭代器
	vector<int>::iterator it = v.begin();
	while (it != v.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
	//3.范围for
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

2.3 vector空间增长问题

在这里插入图片描述
max_size()
在这里插入图片描述

  • capacity的代码在vs和g++下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。这个问题经常会考察,不要固化的认为,vector增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。
  • reserve只负责开辟空间,如果确定知道需要用多少空间,reserve可以缓解vector增容的代价缺陷问题。
  • resize在开空间的同时还会进行初始化,影响size。(开空间+初始化可以用resize()
  • string 和 vector 删除数据时,是不会缩容的(capacity)

单次增容越多,增容次数越少,效率就越高,但是可能浪费空间越多。(如果知道要开多少空间可以用reverve())

shrink_to_fit
在这里插入图片描述
shink_to_fit会把容量变得和size一样,但是这个函数需要慎用,因为空间不是一部分还给操作系统,而是把所有空间都还给操作系统,重新开辟一块空间把数据放入。

2.4 vector 增删查改

在这里插入图片描述
insert
在这里插入图片描述
vector是不支持下标插入的,只支持迭代器;string是支持下标插入的。
vector是没有头插的,可以用insert进行头插。insert也支持尾插。【超过尾插就不可以了,就会越界访问,编译出现错误】

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.insert(v.begin(), -1);//相当于头插
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	v.insert(v.begin() + 5, 20);//相当于尾插
	//v.insert(v.begin() + 7, 30);//这行代码,会报错
	//此时一共有6个数据,如果在第8个位置插入是不可以的,不可以越界
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

在这里插入图片描述
erase
在这里插入图片描述
注意:这里也是迭代器【注意:不能越界】

查找
vector和list都没有查找函数,复用的是算法里面的find()函数
在这里插入图片描述

find()函数支持一段迭代器区间找一个值,没有找到返回last.[所以,是一个前闭后开区间];头文件是#include < algorithm > 算法

删除3->先找3这个位置->删除
代码展示:

	vector<int> v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	//查找
	vector<int>::iterator pos = find(v.begin(), v.end(),3);
	//auto pos = find(v.begin(), v.end(), 3);//这一种比较方便
	if (pos != v.end())
	{
		cout << "找到了" << endl;
		v.erase(pos);
	}
	else
	{
		cout << "没有找到" << endl;
	}
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

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

  • sort对vector可以进行排序,对其他容器也可以进行排序,但是有的并不适合(list)
  • sort默认是升序排序,如果想要降序,就需要仿函数【头文件#include < functional >】
    代码展示
	vector<int> v;
	v.push_back(1);
	v.push_back(0);
	v.push_back(5);
	v.push_back(8);
	v.push_back(4);

	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	//默认升序
	sort(v.begin(), v.end());
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;
	//仿函数,降序
	sort(v.begin(), v.end(), greater<int>());
	for (auto e : v)
	{
		cout << e << " ";
	}
	cout << endl;

在这里插入图片描述


三、总结

以上就是今天要讲的内容,本文详细的介绍了vector的使用,vector iterator的使用,vector空间增长问题,vector增删查改。希望给友友们带来帮助!

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

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

相关文章

selenium自动化测试环境安装教程

0X00前言&#xff1a; Selenium是一个广泛应用于Web应用程序测试的工具。它提供了一组功能强大的API&#xff0c;用于模拟用户与Web浏览器的交互。以下是对Selenium的简要介绍&#xff1a; 功能&#xff1a;Selenium能够自动化执行各种Web浏览器上的操作&#xff0c;如点击、输…

qml保姆级教程五:视图组件

&#x1f482; 个人主页:pp不会算法v &#x1f91f; 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 &#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 QML系列教程 QML教程一&#xff1a;布局组件 文章目录 列表视图ListVi…

API基础————包

什么是包&#xff0c;package实际上就是一个文件夹&#xff0c;便于程序员更好的管理维护自己的代码。它可以使得一个项目结构更加清晰明了。 Java也有20年历史了&#xff0c;这么多年有这么多程序员写了无数行代码&#xff0c;其中有大量重复的&#xff0c;为了更加便捷省时地…

十天学完基础数据结构-第九天(堆(Heap))

堆的基本概念 堆是一种特殊的树形数据结构&#xff0c;通常用于实现优先级队列。堆具有以下两个主要特点&#xff1a; 父节点的值始终大于或等于其子节点的值&#xff08;最大堆&#xff09;&#xff0c;或者父节点的值始终小于或等于其子节点的值&#xff08;最小堆&#xff…

【2023年11月第四版教材】第18章《项目绩效域》(合集篇)

第18章《项目绩效域》&#xff08;合集篇&#xff09; 1 章节内容2 干系人绩效域2.1 绩效要点2.2 执行效果检查2.3 与其他绩效域的相互作用 3 团队绩效域3.1 绩效要点3.2 与其他绩效域的相互作用3.3 执行效果检查3.4 开发方法和生命周期绩效域 4 绩效要点4.1 与其他绩效域的相互…

深入了解 PostgreSQL:功能、特性和部署

PostgreSQL&#xff0c;通常简称为Postgres&#xff0c;是一款强大且开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它在数据存储和处理方面提供了广泛的功能和灵活性。本文将详细介绍 PostgreSQL 的功能、特性以及如何部署和使用它。 什么是 PostgreSQ…

C#,数值计算——完全VEGAS编码的蒙特·卡洛计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Complete VEGAS Code /// adaptive/recursive Monte Carlo /// </summary> public abstract class VEGAS { const int NDMX 50; const int …

【HCIE】跨域MPLS-VPN Option C 方式一

实验目的&#xff1a;R5与R7私网互通&#xff1b;R6与R8私网互通 说明&#xff1a;R1PE1&#xff1b;R2ASBR1&#xff1b;R3-ASBR2&#xff1b;R4PE2&#xff1b;R5/R6/R7/R8CE 方式一图谱 步骤1&#xff1a;给R1 R9 R2 R3 R4 配置接口IP与环回IP &#xff08;略&#xff09; …

互联网Java工程师面试题·Elasticsearch 篇·第二弹

12、详细描述一下 Elasticsearch 索引文档的过程。 协调节点默认使用文档 ID 参与计算&#xff08;也支持通过 routing &#xff09;&#xff0c;以便为路由提供合适的分片。 shard hash(document_id) % (num_of_primary_shards) 1 、当分片所在的节点接收到来自协调节点…

阿里云服务器价格计算器(一键计算精准报价)

阿里云服务器价格计算器&#xff0c;鼠标选择云服务器ECS实例规格、地域、系统盘、带宽及购买时长即可一键计算出精准报价&#xff0c;阿里云服务器网分享阿里云服务器价格计算器链接地址&#xff1a; 目录 阿里云服务器价格计算器 阿里云服务器价格计算器 先打开阿里云服务…

【Java】猫和狗接口版本思路分析

目录 猫&#x1f431;和狗&#x1f415;&#xff08;接口版本&#xff09; 画图分析 案例代码 猫&#x1f431;和狗&#x1f415;&#xff08;接口版本&#xff09; 需求&#xff1a;对猫和狗进行训练&#xff0c;它们就可以跳高了&#xff0c;这里加入了跳高功能&#xff0…

Dubbo3应用开发—Dubbo注册中心引言

Dubbo注册中心引言 什么是Dubbo注册中心 Dubbo的注册中心&#xff0c;是Dubbo服务治理的⼀个重要的概念&#xff0c;他主要用于 RPC服务集群实例的管理。 注册中心的运行流程 使用注册中心的好处 可以有效的管理RPC集群的健康情况&#xff0c;动态的上线或者下线服务。让我…

计算机网络——计算机网络的性能指标(上)-速率、带宽、吞吐量、时延

目录 速率 比特 速率 例1 带宽 带宽在模拟信号系统中的意义 带宽在计算机网络中的意义 吞吐量 时延 发送时延 传播时延 处理时延 例2 例3 速率 了解速率之前&#xff0c;先详细了解一下比特&#xff1a; 比特 计算机中数据量的单位&#xff0c;也是信息论中信…

Elasticsearch数据操作原理

Elasticsearch 是一个开源的、基于 Lucene 的分布式搜索和分析引擎&#xff0c;设计用于云计算环境中&#xff0c;能够实现实时的、可扩展的搜索、分析和探索全文和结构化数据。它具有高度的可扩展性&#xff0c;可以在短时间内搜索和分析大量数据。 Elasticsearch 不仅仅是一个…

《向量数据库指南》——用Milvus cloud搭建聊天机器人

作为向量数据库的佼佼者&#xff0c;Milvus 适用于各种需要借助高效和可扩展向量搜索功能的 AI 应用。 举个例子&#xff0c;如果想要搭建一个聊天机器人&#xff0c;Milvus 一定是其进行数据管理的首选。那么&#xff0c;如何让这个应用程序开发变得易于管理及更好理解&#x…

力扣第226翻转二叉数 c++三种方法 +注释

题目 226. 翻转二叉树 简单 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&am…

阿里云服务器镜像系统Anolis OS龙蜥详细介绍

阿里云服务器Anolis OS镜像系统由龙蜥OpenAnolis社区推出&#xff0c;Anolis OS是CentOS 8 100%兼容替代版本&#xff0c;Anolis OS是完全开源、中立、开放的Linux发行版&#xff0c;具备企业级的稳定性、高性能、安全性和可靠性。目前阿里云服务器ECS可选的Anolis OS镜像系统版…

Linux shell编程学习笔记8:使用字符串

一、前言 字符串是大多数编程语言中最常用最有用的数据类型&#xff0c;这在Linux shell编程中也不例外。 本文讨论了Linux Shell编程中的字符串的三种定义方式的差别&#xff0c;以及字符串拼接、取字符串长度、提取字符串、查找子字符串等常用字符串操作,&#xff0c;以及反…

Nacos 使用

大家好我是苏麟今天带来Nacos注册中心 . Nacos注册中心 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心&#xff0c;SpringCloudAlibaba也推出了一个名为Nacos的 注册中心。 认识Nacos Nacos是阿里巴巴的产品&#xff0c;现在是SpringCloud中的一个组件。相比E…

【Spring笔记04】Spring中Bean的生命周期及Bean的后置处理器

这篇文章主要介绍的是Spring框架中Bean的生命周期&#xff0c;Bean的后置处理器、以及多个后置处理器的先后执行顺序。 目录 一、生命周期介绍 1.1、什么是Bean的生命周期 1.2、Bean生命周期的过程 &#xff08;1&#xff09;实例化阶段 &#xff08;2&#xff09;依赖注入…