【C++】STL之vector操作

文章目录

  • 简介
    • vector中的成员类型
    • 模板参数
    • 头文件的包含
    • 构造函数
    • vector的访问方式:
      • 下标[ ]
      • 迭代器
      • 范围for
    • 交换swap

简介

vector是stl中的一种数组容器,vector在英文中有矢量的意思,但实际上在数据结构中就是一种类似于数组的结构;
与之前学习的string不同,string是针对字符串的一个容器,而vector却是一个类模板,意思就是vector这个容器中,可以存放的数据不只只有内置类型,同时也有自定义类型;

内置类型 自定义类型
vector< int > vector< string >
vector< double >vector< vector< int > >
vector< char >......
............

vector中的成员类型

作为一个类模板,vector中有许多的成员类型,这些成员类型一般是在类域中typedef出来的类型;

在这里插入图片描述
[图片源自cplusplus]


模板参数

在这里插入图片描述
该类模板中共有两个模板参数;

  • class T
    该模板参数为数据类型,即vector中保存的数据类型;
  • class Alloc = allocator< T >
    该模板参数为内存池的类型,不过该模板参数给了一个缺省值,默认所给的这个缺省值为标准库中的内存池,同时也可以自己实现一个内存池进行传参;

头文件的包含

在使用vector时需要包含头文件;

#include <vector>

构造函数

在C++98的版本中,vector共有四个构造函数;

explicit vector (const allocator_type& alloc = allocator_type())构造一个空的vector
explicit vector (size_type n, const value_type& val = value_type(), const allocator_type& alloc = allocator_type());用n个val进行构造
template vector (InputIterator first, InputIterator last, const allocator_type& alloc = allocator_type());迭代器构造
vector (const vector& x)拷贝构造
#include<iostream>#include<vector>using namespace std;namespace std {void test_vector_Creat() {/** 构造一个空的vector<int> 对象*/vector<int> a;a.push_back(1);a.push_back(2);a.push_back(3);a.push_back(4);/** 用10个6构造一个vector<int> 对象*/vector<int> b(10, 6);/** 用b的迭代器范围构造一个vector<int> 对象*/vector<int> c(b.begin() + 6, b.end());/** 以c作为参数拷贝构造一个vector<int> 对象*/vector<int> Copy_c(c);cout << "a:";for (auto in : a) {cout << in << " ";}cout << endl;cout << "b:";for (auto in : b) {cout << in << " ";}cout << endl;cout << "c:";for (auto in : c) {cout << in << " ";}cout << endl;cout << "Copy_c:";for (auto in : Copy_c) {cout << in << " ";}cout << endl;}}

vector的访问方式:

下标[ ]

在vector中,可以实现像数组或者string那样以下标和下标访问操作符[ ]进行数据的访问;
最主要的原因是在vector中存在与string容器一样的[ ]操作符重载;
在这里插入图片描述

同样的,在vector中也拥有两个版本的重载,返回值中的reference即为引用的意思,返回值返回一个引用;
同时另一个版本的const_reference返回值为返回一个const修饰的引用;
在使用时会自动根据需要进行返回;


迭代器

迭代器的使用方法与string中的迭代器使用方法相同,唯一的不同点是,在vector中使用迭代器不能使用类名,而是应该使用类型名;

vecror <int> ::iterator it = xxx.begin();

该迭代器也为前闭后开区间;


范围for

范围for的底层实际上就是替换成了迭代器,对于存储内置类型的vector来说,并不会有什么影响,而若是使用存储自定义类型的vector的范围for则需要注意;

vector<string> strV;
strV.push_back("张三");
strV.push_back("李四");
strV.push_back("王五")for(auto str:strV){cout<<str<<endl;
}

在上面这段代码中出现了一个问题,由于范围for的底层为使用迭代器遍历整个vector,但是范围for只是将一个对象赋值到一个变量;
在这里将每个string对象赋值给str,由于这里是临时对象,将会出现深浅拷贝的问题,若是将vector中的每个string对象都赋值到str中,将会进行隐式类型转换并进行深拷贝,加大开销;

若是想用范围for来遍历存储自定义类型的vector,则最好的办法是利用引用,若是害怕数据在遍历过程中被更改,即可以加上const修饰;

vector<string> strV;
strV.push_back("张三");
strV.push_back("李四");
strV.push_back("王五")for(const auto& str:strV){cout<<str<<endl;
}

交换swap

在vector中也有一个swap成员函数,该函数也是为了避免容器自定义类型使用标准库中的swap函数导致产生过大开销;

vector::swap( ) 的使用也与string::swap( ) 相同,本质上就是交换指针或者数据;

vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);vector<int> v2;
v1.push_back(5);
v1.push_back(5);
v1.push_back(3);
v1.push_back(3);v1.swap(v2);

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

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

相关文章

AI大模型服务应用场景

大模型是指模型具有庞大的参数规模和复杂程度的机器学习模型。在深度学习领域&#xff0c;大模型通常是指具有数百万到数十亿参数的神经网络模型。这些模型通常在各种领域&#xff0c;例如自然语言处理、图像识别和语音识别等&#xff0c;表现出高度准确和广泛的泛化能力。伴随…

Jmeter系列-定时器Timers的基本介绍(11)

简介 JMeter中的定时器&#xff08;Timer&#xff09;是一种重要的元件&#xff0c;用于模拟用户在不同时间间隔内发送请求的场景。通过使用定时器&#xff0c;可以模拟负载、并发和容量等不同情况下的请求发送频率。 使用定时器 可以在取样器下添加定时器&#xff0c;这样定…

MySQL日常使用记录

1.时间 1.1.时间格式化 yyyy-MM-dd HH:mm:ss格式&#xff0c;如下&#xff1a; select date_format(now(), %Y-%m-%d %H:%i:%s) from dual;date_format函数是将date类型按照指定的格式转换成varchar类型 1.2.日期加减 当前天 1 天 select date_format(now(), %Y-%m-%d), …

持安科技孙维伯:零信任理念下的实战攻防:ISC2023数字小镇演讲

近日&#xff0c;在ISC 2023第十一届互联网安全大会上&#xff0c;持安科技联合创始人孙维伯作为零信任办公安全赛道代表&#xff0c;亮相数字小镇New50&#xff0c;并发表《全方位防御&#xff1a;零信任理念下的实战攻防》主题演讲。 以下是本次演讲实录&#xff1a; 这几年…

系统灰度随笔记

系统灰度随笔记 这段时间系统重构&#xff0c;负责重构的其中一个模块需要与四个上游系统对接进行切换&#xff0c;虽然自己在这个过程中也设计了一套灰度方案来承接&#xff0c;将灰度的主动权控制在下游&#xff0c;但是很难同时应对四个上游系统&#xff0c;因为每个上游系…

Redis的介绍以及简单使用

Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存数据存储系统&#xff0c;它以键值对的形式将数据存在内存中&#xff0c;并提供灵活、高性能的数据访问方式。Redis具有高速读写能力和丰富的数据结构支持&#xff0c;可以广泛应用于缓存、消息队列、实…

vue的由来、vue教程和M-V-VM架构思想、vue的使用、nodejs

vue vue的由来 vue教程和M-V-VM架构思想 vue的初步简单使用 nodejs vue的由来 # 1 HTML(5)、CSS(3)、JavaScript(ES5、ES6、ES11)&#xff1a;编写一个个的页面 -> 给后端(PHP、Python、Go、Java) -> 后端嵌入模板语法 -> 后端渲染完数据 -> 返回数据给前端 ->…

ATLAS 200通过PCIE 接入RK3588-EP模式

ATLAS 200 作为算理模块&#xff0c;可以作为主/协处理器接入RK3588,有两种模式&#xff1a;RC 模式和EP模式 RC模式&#xff1a;rk3588 和 ATLAS 200 可分别独立处理自身业务数据&#xff0c;不存在业务互相依赖&#xff0c;二者可通过网络等方式进行通信&#xff0c;ATLAS …

【SpringCloud微服务全家桶学习笔记-服务注册zookeeper/consul】

SpringCloud微服务全家桶学习笔记 Eureka服务注册 gitee码云仓库 9.其他服务注册框架 &#xff08;1&#xff09;zookeeper安装与使用 zookeeper需安装在虚拟机上&#xff0c;建议使用CentOS&#xff0c;安装地址如下&#xff1a; zookeeper镜像源 选择第一个进入后下载ta…

Unity实战(11):项目非启动状态下使用代码批量替换材质

目录 前言 配置环境 一、场景准备 二、代码演示 三、效果呈现 四、关于Resources.Load()的说明 前言 本文内容为unity在编辑状态&#xff08;非启动状态&#xff09;下使用代码批量替换材质&#xff0c;该方法也适用于其他在编辑状态下对物体的操作需求。 配置环境 win1…

ros2与web通信实例

ros2与web通信实例 最近需要进行ros2与web端进行通信操作&#xff0c;目标是ros2发送的消息web端能够显示在界面&#xff0c;并且前端能够发布数据&#xff0c;最终实例如下&#xff1a; 然而网上查的的资料如古月居的&#xff1a; 利用Websocket实现ROS与Web的交互 https:/…

子网掩码的作用

1.子网掩码的作用 子网掩码是用来给ip划分网络位和主机位的。 子网掩码是为了给ip确定谁是网络地址、谁是主机地址的。子网掩码的二进制位是1的对应的是网络地址&#xff0c;子网掩码的二进制位是0的对应的是主机地址。

Ribbon负载均衡器

两种&#xff1a; 1.1 集中式负载均衡&#xff0c;服务端负载均衡 硬件 nginx 轮询、负载、哈希、随机、权重 为什么要做负载均衡&#xff1f; 1.2 客户端负载均衡器 用客户端 负载均衡器 很多机制可以自定义 小知识&#xff1a;不想让别人调自己&#xff0c;只想用别人的…

使用Arduino简单测试HC-08蓝牙模块

目录 模块简介模块测试接线代码测试现象 总结 模块简介 HC-08 蓝牙串口通信模块是新一代的基于 Bluetooth Specification V4.0 BLE 蓝牙协议的数传模块。无线工作频段为 2.4GHz ISM&#xff0c;调制方式是 GFSK。模块最大发射功率为4dBm&#xff0c;接收灵度-93dBm&#xff0c…

51单片机光照强度检测自动路灯开关仿真( proteus仿真+程序+报告+讲解视频)

51单片机光照强度检测自动路灯开关仿真( proteus仿真程序报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0052 讲解视频 基于51单片机的光照检测自动路灯控制仿真设计( proteus仿…

如何搭建游戏平台?

搭建游戏平台是一个复杂的任务&#xff0c;涉及多个方面的工作。下面是一些关键步骤和注意事项&#xff0c;以帮助您搭建游戏平台&#xff1a; 平台开发&#xff1a;开发游戏平台的关键部分&#xff0c;包括网站或应用程序的开发、数据库设计、用户界面设计、游戏上传和管理工具…

加速新药问世,药企如何利用云+网的优势?

随着计算能力的不断提高和人工智能技术的迅速发展&#xff0c;药物研发领域正迎来一场革命。云端强大的智能算法正成为药物研发企业的得力助手&#xff0c;推动着药物的精确设计和固相筛选。这使得药物设计、固相筛选以及药物制剂开发的时间大幅缩短&#xff0c;有望加速新药物…

MyBatis之增删查改功能

文章目录 一、创建各种类二、MyBatis的各种功能 1、查询<select>2、增加<insert>3、修改<update>4、删除<delete>三、总结 前言 在MyBatis项目中编写代码实现对MySql数据库的增删查改 一、创建各种类 1、在Java包的mapper文件下创建一个接口 我创建…

vmware NAT模式配置方式

VMware在NAT模式下宿主机与多台虚拟机互相访问&#xff0c;可连接外网 虚拟机的网络连接类型的选择&#xff0c;网络连接类型一共有桥接、NAT、仅主机和不联网四种。 桥接&#xff1a;选择桥接模式的话虚拟机和宿主机在网络上就是平级的关系&#xff0c;相当于连接在同一交换机…

滚雪球学Java(25):动态代理

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…