【C++】vector介绍

个人主页 : zxctscl
如有转载请先通知

文章目录

  • 1. 前言
  • 2. vector的介绍
  • 3. Member functions
    • 3.1 (constructor)
    • 3.2 (destructor)
  • 4. Capacity
    • 4.1 resize
    • 4.2 reserve
    • 4.3 shrink_to_fit
  • 5. vector 增删查改
    • 5.1 push_back
    • 5.2 insert
    • 5.3 pop_back
    • 5.4 find
    • 5.5 erase

1. 前言

在之前已经介绍了string类 【C++】string类初步介绍和【C++】string进一步介绍,这次来看看C++中的顺序表vector。

2. vector的介绍

在这里插入图片描述

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

3. Member functions

在这里插入图片描述

3.1 (constructor)

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

构造有: vector<int> v;

   vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;

在这里插入图片描述
还有在构造的时候直接赋值vector<int>v(10, 1);构造一个int类型的顺序表开了10个空间,这10个空间初始化为1:
在这里插入图片描述

3.2 (destructor)

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

4. Capacity

在这里插入图片描述

4.1 resize

在这里插入图片描述
resize开一个空间,空间开好了以后,进行填值初始化。

举个例子:开10个空间,然后初始化为0:

    vector<int> a;a.resize(10, 0);for (auto e : a){cout << e << " ";}cout << endl;

在这里插入图片描述

4.2 reserve

在这里插入图片描述
来看看vector的扩容机制:

void test_vector2()
{size_t sz;vector<int> v;sz = v.capacity();cout << "making v 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';}}
}

在这里插入图片描述
这里是以1.5倍扩容,不过这里取整了。
如果不想扩容发生,就用reserve提前先开好空间。

void test_vector2()
{size_t sz;vector<int> v;v.reserve(100);sz = v.capacity();cout << "making v 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';}}
}

这样就不用扩容了:
在这里插入图片描述
在这里插入图片描述

一般来说resize和reserve都不会缩容:

size_t sz;vector<int> v;v.reserve(100);cout << v.size() << endl;cout << v.capacity() << endl;v.reserve(10);cout << v.size() << endl;cout << v.capacity() << endl;cout << "-----------------" << endl;cout << v.size() << endl;cout << v.capacity() << endl;v.resize(10);cout << v.size() << endl;cout << v.capacity() << endl;

在这里插入图片描述

4.3 shrink_to_fit

要想缩容就调用这个接口shrink_to_fit
在这里插入图片描述

    vector<int> v;v.reserve(100);cout << v.size() << endl;cout << v.capacity() << endl;v.reserve(10);cout << v.size() << endl;cout << v.capacity() << endl;cout << "-----------------" << endl;cout << v.size() << endl;cout << v.capacity() << endl;v.resize(10);cout << v.size() << endl;cout << v.capacity() << endl;cout << "-----------------" << endl;v.shrink_to_fit();cout << v.size() << endl;cout << v.capacity() << endl;

这样就实现了缩容:
在这里插入图片描述

5. vector 增删查改

5.1 push_back

在这里插入图片描述
vector只支持单个数据的尾插。
直接来看看代码:

#include<iostream>
using namespace std;#include<vector>
int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;vector<int>::iterator it = v.begin();while (it != v.end()){cout << *it << " ";++it;}cout << endl;return 0;
}

在这里插入图片描述

5.2 insert

在这里插入图片描述
来试试头插:

    vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){cout << e << " ";}cout << endl;v.insert(v.begin(), 0);for (auto e : v){cout << e << " ";}cout << endl;

在这里插入图片描述
也可以插入一段迭代区间:

    vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){cout << e << " ";}cout << endl;v.insert(v.begin(), 0);for (auto e : v){cout << e << " ";}cout << endl;string s("abcd");v.insert(v.begin(), s.begin(),s.end());for (auto e : v){cout << e << " ";}cout << endl;

这里隐私类型转换,将abcd转换为对应的ascii值:
在这里插入图片描述

5.3 pop_back

尾删
在这里插入图片描述
来看看代码:

vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;v.pop_back();for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;v.pop_back();for (size_t i = 0; i < v.size(); i++){cout << v[i] << " ";}cout << endl;

在这里插入图片描述

5.4 find

在这里插入图片描述
在vector里面发现没有find,如果我们想要使用find来查找,那么就得用到算法库里面的就行。使用它得包含一个头文件:#include<algorithm>
在这里插入图片描述
举个例子:在3位置插入30

#include<iostream>
#include<algorithm>
using namespace std;
#include<vector>
int main()
{vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){cout << e << " ";}cout << endl;vector<int>::iterator pos=find(v.begin(), v.end(), 3);if (pos != v.end()){v.insert(pos, 30);}for (auto e : v){cout << e << " ";}cout << endl;
}

在这里插入图片描述

5.5 erase

在这里插入图片描述
举个例子删除3位置:

    vector<int> v;v.push_back(1);v.push_back(2);v.push_back(3);v.push_back(4);v.push_back(5);for (auto e : v){cout << e << " ";}cout << endl;vector<int>::iterator pos = find(v.begin(), v.end(), 3);if (pos != v.end()){v.erase(pos);}for (auto e : v){cout << e << " ";}cout << endl;

在这里插入图片描述

有问题请指出,大家一起进步!!!

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

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

相关文章

【C++】模板与泛型编程

文章目录 1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化 4. 非类型模板参数5. 模板的特化5.1 概念5.2 函数模板特化5.3 全特化5.4 偏特化5.5 类模板…

Docker 搭建Redis集群

目录 1. 3主3从架构说明 2. 3主3从Redis集群配置 2.1关闭防火墙启动docker后台服务 2.2 新建6个docker容器实例 2.3 进去任意一台redis容器&#xff0c;为6台机器构建集群关系 2.4 进去6381&#xff0c;查看集群状态 3. 主从容错切换迁移 3.1 数据读写存储 3.1.1 查看…

【JDBC编程】基于MySql的Java应用程序中访问数据库与交互数据的技术

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

java switch用法

满足那个条件&#xff0c;就从那个入口进入&#xff0c;没有break就继续&#xff08;是这样设计的&#xff0c;需要自己加break;&#xff09;&#xff0c;一般都是要加break的。 switch (表达式) 表达式只能是【整型、char、String.】 import java.util.Scanner;public class…

微服务day07 -- ES集群

4.集群 单机的elasticsearch做数据存储&#xff0c;必然面临两个问题&#xff1a;海量数据存储问题、单点故障问题。 海量数据存储问题&#xff1a;将索引库从逻辑上拆分为N个分片&#xff08;shard&#xff09;&#xff0c;存储到多个节点 单点故障问题&#xff1a;将分片数…

Review(一)

&#x1f308;个人主页&#xff1a;Rookie Maker &#x1f525; 系列专栏&#xff1a;Rookie review &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x1f601…

DRC检查及丝印的调整

DRC检查及丝印的调整 综述&#xff1a;本文主要讲述AD软件中DRC检查、丝印的调整以及logo的添加的相关步骤&#xff0c;附加logo添加的脚本链接和大量操作图片&#xff0c;使步骤详细直观。 1. 点击“工具”→“设计规则检查”→“运行DRC”。&#xff08;一开始可以只开启电…

一个程序从编译到运行的全过程

一个程序从编译到运行的全过程 一个程序从编译到运行的全过程编译预处理编译 汇编链接载入虚拟内存用户空间 总结 一个程序从编译到运行的全过程 每次用编译器写完一个程序后&#xff0c;我们会进行调试和执行&#xff0c;将代码的结果输出在我们的电脑屏幕上&#xff0c;但是…

Python爬虫学习完整版

一、什么是爬虫 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性&#xff0c;根据用户需求定向抓取相关网页并分析也成为如今主流的爬取策略。 1 爬虫可以做什么 你可以爬取网络上的的图片&#…

全民采矿石赚钱小程序源码,附带详细搭建教程

安装教程 1、环境用宝塔Nginxphp7.0或者以下版本 2、可以更换各种模板&#xff0c;懂代码和标签的可以改模板&#xff0c;不懂的可以直接上站 3、上站前记得添加关键词和内容库 4、伪静态在绑定完百度站长之后再添加 目录说明&#xff1a; data/keyword 放关键词 标签&#xff…

OpenLayers基础教程——WebGLPoints图层样式的设置方法

1、前言 前一篇博客介绍了如何在OpenLayers中使用WebGLPoints加载海量数据点的方法&#xff0c;这篇博客就来介绍一下WebGLPoints图层的样式设置问题。 2、样式运算符 在VectorLayer图层中&#xff0c;我们只需要创建一个ol.style.Style对象即可&#xff0c;WebGLPoints则不…

浅谈Webmail邮件还原

Webmail还原&#xff0c;其实也就是HTTP协议的还原&#xff0c;而HTTP协议的还原&#xff0c;核心部分是TCP会话的重组。在TCP会话进行重组之后&#xff0c;再对重组的报文进行HTTP解析&#xff0c;得到Webmail中相应的信息。 由于每个邮件服务商实现Webmail的方式都各不相同&a…

LabVIEW智能降噪系统

LabVIEW智能降噪系统 随着噪声污染问题的日益严重&#xff0c;寻找有效的降噪技术变得尤为关键。介绍了一种基于LabVIEW平台开发的智能降噪系统&#xff0c;该系统能够实时采集环境噪声&#xff0c;并通过先进的信号处理技术实现主动降噪&#xff0c;从而有效改善生活和工作环…

CV论文--2024.3.26

1、DiffusionMTL: Learning Multi-Task Denoising Diffusion Model from Partially Annotated Data 中文标题&#xff1a;DiffusionMTL&#xff1a;从部分注释的数据中学习多任务去噪扩散模型 简介&#xff1a;最近&#xff0c;人们对于从部分标注数据中学习多个密集场景理解任…

qt table 简易封装,样式美化,以及 合并表格和颜色的区分 已解决

在需求中&#xff0c; 难免会使用 table 进行渲染窗口&#xff0c;做一个简单的封装。美化表格最终效果&#xff01;&#xff01;&#xff01; 代码部分 // 显示 20行 20列CCendDetailsInfoTableWidget* table new CCendDetailsInfoTableWidget(20,10);for (int i 0; i < …

蓝桥杯2023年第十四届省赛真题-买瓜|DFS+剪枝

题目链接&#xff1a; 0买瓜 - 蓝桥云课 (lanqiao.cn) 蓝桥杯2023年第十四届省赛真题-买瓜 - C语言网 (dotcpp.com) &#xff08;蓝桥官网的数据要求会高一些&#xff09; 说明&#xff1a; 这道题可以分析出&#xff1a;对一个瓜有三种选择&#xff1a; 不拿&#xff0c…

Hbase解决ERROR: KeeperErrorCode = ConnectionLoss for /hbase/master报错

在使用hbase时出错&#xff0c;错误如下图&#xff1a; 错误原因&#xff1a; 返回去检查启动的Hadoop与zookeeper&#xff0c;发现zookeeper的状态不对&#xff0c;重新启动了一下zookeeper&#xff0c;确保所有机器的zookeeper都启动起来了就可以了。

微服务(基础篇-004-Feign)

目录 http客户端Feign Feign替代RestTemplate&#xff08;1&#xff09; Feign的介绍&#xff08;1.1&#xff09; 使用Feign的步骤&#xff08;1.2&#xff09; 自定义配置&#xff08;2&#xff09; 配置Feign日志的两种方式&#xff08;2.1&#xff09; Feign使用优化…

【C++】哈希应用之位图

&#x1f440;樊梓慕&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》《算法》 &#x1f31d;每一个不曾起舞的日子&#xff0c;都是对生命的辜负 目录 前言 1.位图的概念 2.位…

解决“Pycharm中Matplotlib图像不弹出独立的显示窗口”问题

matplotlib的绘图的结果默认显示在SciView窗口中, 而不是弹出独立的窗口, 这样看起来就不是很舒服&#xff0c;不习惯。 通过修改设置&#xff0c;改成独立弹出的窗口。 File—>Settings—>Tools—>Python Scientific—>Show plots in toolwindow 将√去掉即可