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

【STL四】序列容器——vector容器

【STL容器】序列容器——vector容器

  • 一、简介
  • 二、头文件
  • 三、模板类
  • 四、成员函数
    • 1、迭代器
    • 2、元素访问
    • 3、容量
    • 4、修改操作
  • 五、demo
    • 1、容量reserve、capacity、shrink_to_fit
    • 2、修改操作pop_back()、push_back
    • 3、修改操作insert()
    • 4、修改操作emplace()
    • 5、修改操作erase()、swap()、clear() 、
    • 6、emplace_back()和push_back()的区别
    • 7、insert()和emplace()

一、简介

  • vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整所占用的内存空间,整个过程无需人工干预。

array实现的是一个静态数组。

  • vector 常被称为向量容器,因为该容器擅长在尾部插入或删除元素,在常量时间内就可以完成,时间复杂度为O(1);而对于在容器头部或者中部插入或删除元素,则花费时间要长一些(移动元素需要耗费时间),时间复杂度为线性阶O(n)。
    在这里插入图片描述

二、头文件

#include<vector>

三、模板类

template<class T,class Allocator = std::allocator<T>
> class vector;

四、成员函数

1、迭代器

成员函数功能
begin()同array容器
end()同array容器
rbegin()同array容器
rend()同array容器
cbegin()同array容器
cend()同array容器
crbegin()同array容器
crend()同array容器

2、元素访问

成员函数功能
at(n)同array容器
operator[]同array容器
front()同array容器
back()同array容器
data()同array容器

3、容量

成员函数功能
empty()同array容器
size()同array容器
max_size()同array容器
reserve增加容器的容量。
capacity返回当前容量。
shrink_to_fit将内存减少到等于当前元素实际所使用的大小。

4、修改操作

成员函数功能
clear()移出所有的元素,容器大小变为 0。
insert()在指定的位置插入一个或多个元素。
emplace()在指定的位置直接生成一个元素。
erase()移出一个元素或一段元素。
push_back()在序列的尾部添加一个元素。
emplace_back()在序列尾部生成一个元素。
pop_back()移出序列尾部的元素。
resize()调整容器的大小。
swap()交换两个容器的所有元素。

五、demo

1、容量reserve、capacity、shrink_to_fit

//array 容器。
#include <iostream>
#include <vector>
#include<string>
using namespace std;
int main()
{vector<string>  v{ "one","two","three","four","five" }; cout << "v.size()=" << v.size() << endl;cout << "v.capacity()=" << v.capacity() << endl<<endl;v.reserve(10);cout << "after reserve(10)" << endl;cout << "v.size()=" << v.size() << endl;cout << "v.capacity()=" << v.capacity() << endl<<endl;v.shrink_to_fit();cout << "after shrink_to_fit()" << endl;cout << "v.size()=" << v.size() << endl;cout << "v.capacity()=" << v.capacity() << endl << endl;return 0;
}

输出

v.size()=5
v.capacity()=5


after reserve(10)
v.size()=5
v.capacity()=10


after shrink_to_fit()
v.size()=5
v.capacity()=5

2、修改操作pop_back()、push_back

//vector 容器。
#include <iostream>
#include <vector>
#include<string>
using namespace std;
int main()
{vector<string>  v{ "one","two","three","four","five" }; v.pop_back();v.push_back("six");for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;
}

输出

one two three four six

3、修改操作insert()

语法格式用法说明
iterator insert(pos,elem)在迭代器 pos 指定的位置之前插入一个新元素elem,并返回表示新插入元素位置的迭代器。
iterator insert(pos,n,elem)在迭代器 pos 指定的位置之前插入 n 个元素 elem,并返回表示第一个新插入元素位置的迭代器。
iterator insert(pos,first,last)在迭代器 pos 指定的位置之前,插入其他容器(不仅限于vector)中位于 [first,last) 区域的所有元素,并返回表示第一个新插入元素位置的迭代器。
//vector 容器。
#include <iostream>
#include <vector>
#include<string>
using namespace std;
int main()
{vector<string>  v{ "one","two","three","four","five" }; v.insert(v.begin(),"ten");for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;v.insert(v.end(), { "ten","ten2" });for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;return 0;
}

输出

ten one two three four five
ten one two three four five ten ten2

4、修改操作emplace()

是 C++ 11 标准新增加的成员函数,用于在 vector 容器指定位置之前插入一个新的元素。

  • emplace() 每次只能插入一个元素,而不是多个。

  • 该函数的语法格式如下:

iterator emplace (const_iterator pos, args…);

其中,pos 为指定插入位置的迭代器;args… 表示与新插入元素的构造函数相对应的多个参数;该函数会返回表示新插入元素位置的迭代器。

//vector 容器。
#include <iostream>
#include <vector>
#include<string>
using namespace std;
int main()
{vector<string>  v{ "one","two","three","four","five" }; //emplace() 每次只能插入一个 int 类型元素v.emplace(v.begin(),"ten");for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;return 0;
}

输出

ten one two three four five

5、修改操作erase()、swap()、clear() 、

//vector 容器。
#include <iostream>
#include <vector>
#include<string>
using namespace std;
int main()
{vector<string>  v{ "one","two","three","four","five" }; v.erase(v.begin());for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;vector<string> w{ "1","12" };v.swap(w);for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;v.clear();for (auto it = v.begin(); it < v.end(); it++)cout << *it << " ";cout << endl;return 0;
}

输出

two three four five
1 12
,

6、emplace_back()和push_back()的区别

  • 该函数是 C++ 11 新增加的,其功能和 push_back() 相同,都是在 vector 容器的尾部添加一个元素。
  • emplace_back() 和 push_back() 的区别,就在于底层实现的机制不同。push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。

7、insert()和emplace()

  • 既然 emplace() 和 insert() 都能完成向 vector 容器中插入新元素,那么谁的运行效率更高呢?
    答案是 emplace()。

  • 假如,我们通过 insert() 函数向 vector 容器中插入 testDemo 类对象,需要调用类的构造函数和移动构造函数(或拷贝构造函数);而通过 emplace() 函数实现同样的功能,只需要调用构造函数即可。

同std::list、std::deque

#include <vector>
#include <iostream>
using namespace std;
class testDemo
{
public:testDemo(int num) :num(num) {std::cout << "调用构造函数" << endl;}testDemo(const testDemo& other) :num(other.num) {std::cout << "调用拷贝构造函数" << endl;}testDemo(testDemo&& other) :num(other.num) {std::cout << "调用移动构造函数" << endl;}testDemo& operator=(const testDemo& other);
private:int num;
};
testDemo& testDemo::operator=(const testDemo& other) {this->num = other.num;return *this;
}
int main()
{cout << "insert:" << endl;std::vector<testDemo> demo2{};demo2.insert(demo2.begin(), testDemo(1));cout << "emplace:" << endl;std::vector<testDemo> demo1{};demo1.emplace(demo1.begin(), 1);return 0;
}

输出

insert:
调用构造函数
调用移动构造函数
emplace:
调用构造函数

参考:
1、C++ STL 容器库 中文文档
2、STL教程:C++ STL快速入门
3、https://www.apiref.com/cpp-zh/cpp/header.html
4、https://en.cppreference.com/w/cpp/container

相关文章:

【STL四】序列容器——vector容器

【STL容器】序列容器——vector容器一、简介二、头文件三、模板类四、成员函数1、迭代器2、元素访问3、容量4、修改操作五、demo1、容量reserve、capacity、shrink_to_fit2、修改操作pop_back()、push_back3、修改操作insert()4、修改操作emplace()5、修改操作erase()、swap()、…...

4年功能测试,我一进阶python接口自动化测试,跳槽拿了20k......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 很多人在这求职市场…...

基于Pytorch的可视化工具

深度学习网络通常具有很深的层次结构&#xff0c;而且层与层之间通常会有并联、串联等连接方式。当使用PyTorch建立一个深度学习网络并输出文本向读者展示网络的连接方式是非常低效的&#xff0c;所以需要有效的工具将建立的深度学习网络结构有层次化的展示&#xff0c;这就需要…...

XCPC第十一站,带你学会图论基本算法

我们约定&#xff1a;以下n表示点的数目&#xff0c;m表示边的数目。 引子1——邻接表存储图的方法&#xff08;&#xff09;&#xff08;暂时不考虑重边和自环&#xff09; 现在我们有n个点&#xff08;编号为1~n&#xff09;和m条边&#xff0c;要用数组存储它们&#xff0c…...

【MySQL】1 MySQL的下载、安装与配置|提供安装包

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 目前,已开了以下专栏,欢迎关注与指导 1️⃣Java基础知识系统学习(持续更文中…) 2️⃣UML(已更完) 3️⃣MySQL(持续更文中…) MYSQL的下载、安装与配置1.下载MySQL5.71.1安装包的获…...

Redis 事务

目录Redis 事务一、Redis事务的概念&#xff1a;二、redis事务提出的逻辑&#xff1a;三、redis事务的基本操作四、事务的执行流程五、redis锁六、redis分布式锁Redis 事务 一、Redis事务的概念&#xff1a; Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令&…...

【linux】:进程控制

文章目录 前言一、什么是写时拷贝二、进程控制 1.进程终止2.进程等待三丶进程程序替换总结前言 了解上一篇文章中的进程地址空间后&#xff0c;我们再来说说进程控制的概念&#xff0c;进程控制我们需要搞清楚三个问题&#xff1a;如何进程终止&#xff0c;如何解决僵尸进程问…...

在recyclerview中使用其item布局的ViewBinding类需要注意的问题

问题描述 最近在使用RecycerView的瀑布流布局&#xff0c;我想直接用ViewBinding取得item中的一个TextView然后根据position进行赋值。 比如我点击测试标题2&#xff0c;它在日志中应该能打印出测试标题2才对。 但是他却打印出“测试标题0” 按理来说标题应该更点击的位置对…...

基于EB工具的TC3xx_MCAL配置开发05_ADC模块硬件Pwm触发Demo配置

目录 1.概述2. Pwm相关配置2.1 PWM->General配置2.2 PWM->PwmChannel配置2.2.1 Reference Pwm通道配置2.2.2 触发ADC采集的Pwm通道配置3. ADC相关配置3.1 AdcHwExtTrigSelect配置4. MCU相关配置4.1 GTM配置4.1.1 McuGtmTomAllocationConf配置4.1.2 GtmTriggerForAdc配置1…...

Qt示例3:用Qt画一个温度计

示例1 以下是用Qt绘制一个简单的温度计的示例代码&#xff1a; #include <QPainter> #include <QWidget> #include <QApplication> class Thermometer : public QWidget { public:Thermometer(QWidget *parent 0); protected:void paintEvent(QPaintEvent …...

全卷积网络FCN

这里写目录标题全卷积网络FCN1、FCN2、FCN上采样3、 FCN具体实现过程转置卷积全卷积网络FCN 引用&#xff1a;http://t.csdn.cn/pDcjL 1、FCN FCN: FCN是对图像进行像素级的分类&#xff08;也就是每个像素点都进行分类&#xff09;&#xff0c;从而解决了语义级别的图像分割…...

【Linux】基础IO流(上)

文章目录1. 预备知识2. 回忆C接口fopenfputsfprintfsnprintf追加方式—— a以读方式—— r3.操作系统如何进行读写文件操作open操作系统是如何让用户给自己传递标志位的理解标记位的问题新创建文件权限不正确解决 umask的权限write默认不会对原始文件清空系统层面追加系统层面 …...

【C++】类和对象三大特性--多态

文章目录1. 多态的基本概念2. 多态的定义及实现2.1多态的构成条件2.2 虚函数2.3虚函数的重写2.4 虚函数不能重写和检查是否重写 &#xff08;C11 &#xff09;2.5 重载、覆盖(重写)、隐藏(重定义)的对比3. 纯虚函数和抽象类3.1 概念3.2 接口继承和实现继承4.多态的实现原理4.1虚…...

【微前端】qiankun + vite + vue3

专栏&#xff1a; 【微前端】什么是微前端【微前端】qiankun【微前端】qiankun vite vue3 一、整体结构 在 qiankun 体系下&#xff0c;一个微前端工程包含一个主应用和多个子应用。本质上&#xff0c;每个工程&#xff08;主应用&#xff09;都可以单独开发、运行。 1.1…...

模型部署之TorchScript

一.关于torchscript和jit介绍 1.关于torchscript TorchScript是Pytorch模型&#xff08;继承自nn.Module&#xff09;的中间表示&#xff0c;保存后的torchscript模型可以在像C这种高性能的环境中运行 TorchScript是一种从PyTorch代码创建可序列化和可优化模型的方法。任何T…...

修改linux网卡配置文件的文件名

修改linux网卡配置文件的文件名 查看自己系统中网卡配置文件的文件名 #查看网卡的配置文件名&#xff0c;已经网络的状态 ip a查看系统是否可以使用ifconfig命令 #输入命令 ifconfig #出现以下图片表示ifconfig的命令可用。可能出现的错误&#xff1a;ifconfig command no foun…...

年轻人为啥热衷去寺庙?

年轻人的苦&#xff0c;寺庙最清楚。 周末的寺庙挤满了年轻人&#xff0c;北京雍和宫限流了&#xff0c;杭州灵隐寺十八籽的手串限购了&#xff0c;南京鸡鸣寺从地铁站出口就开始排队了...... “上班和上学&#xff0c;你选择哪个&#xff1f;” ”我选择上香“ 工作和学习…...

Java Spring 框架

当今世界&#xff0c;Java Spring 成为了最流行的 Java 开发框架之一。Spring 框架是一个轻量级的、高效的框架&#xff0c;它是 Java 应用程序开发的理想选择。在本文中&#xff0c;我们将深入探讨 Java Spring 框架的特性、优点以及如何使用它来构建高质量的应用程序。 1.Ja…...

基于OpenCV的人脸识别

目录 &#x1f969; 前言 &#x1f356; 环境使用 &#x1f356; 模块使用 &#x1f356; 模块介绍 &#x1f356; 模块安装问题: &#x1f969; OpenCV 简介 &#x1f356; 安装 OpenCV 模块 &#x1f969; OpenCV 基本使用 &#x1f356; 读取图片 &#x1f357; 【…...

一文带你看懂电压放大器和功率放大器的区别

很多人对于电压放大器和功率放大器总是分不太清&#xff0c;在实际应用过程中&#xff0c;电压放大器和功率放大器所起到的作用都是相同的。对于功率放大器和电压放大器的区别&#xff0c;今天就让安泰电子来带我们一起看看。功率放大器和电压放大器的主要区别是&#xff1a;功…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1)&#xff1a;从基础到实战的深度解析-CSDN博客&#xff0c;但实际面试中&#xff0c;企业更关注候选人对复杂场景的应对能力&#xff08;如多设备并发扫描、低功耗与高发现率的平衡&#xff09;和前沿技术的…...

vue3 字体颜色设置的多种方式

在Vue 3中设置字体颜色可以通过多种方式实现&#xff0c;这取决于你是想在组件内部直接设置&#xff0c;还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法&#xff1a; 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...