【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), …

C++中将类成员函数作为变量传递给函数

假设类ClassName有一个成员函数 void ClassName::funcname(int);通过typedef定义一个类成员函数指针类型,参数和返回值类型都要与成员函数对应 typedef void (ClassName::*FuncPtr)(int); // 定义类成员函数指针获取到的参数就是 FuncPtr pf

持安科技孙维伯:零信任理念下的实战攻防: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…

WebSocke(简略笔记)

介绍 WebSocket是基于TCP的一种新的网络协议&#xff0c;实现了浏览器域服务器全双工通信——浏览器和服务器只需要完成一次握手&#xff0c;两者直接就可以创建持久性的连接&#xff0c;并进行双向数据传输。 Http协议和WebSocket协议对比&#xff1a; * HTTP是短连接 * We…

python经典百题之逆序打印字符串

题目&#xff1a;利用递归函数调用方式&#xff0c;将所输入的5个字符&#xff0c;以相反顺序打印出来。 方法1: 简单递归 def reverse_print(s, idx):if idx < 0:returnprint(s[idx], end"")reverse_print(s, idx - 1)input_str "hello" reverse_pr…

【核辐射监测】 隐私协议

【核辐射监测】隐私协议 1.个人信息的收集和使用 我们的应用程序不会收集用户的个人信息&#xff0c;包括姓名、地址、电子邮件地址、电话号码等。我们不会追踪用户的位置信息或共享用户的个人信息。 2. 非个人化信息的收集和使用 我们的应用程序可能会收集一些非个人化信息…

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

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

ResponseEntity下载包含点的文件名无法下载

ResponseEntity下载包含点的文件名无法下载 原因&#xff1a;这可能是因为浏览器或服务器不正确地解析文件名的问题。文件名中的点通常被解释为文件扩展名的一部分 1.UriUtils String filename "file.name.with.dot.txt"; // 替换为你的文件名 filename UriUtil…

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…

[2023-09-12]Oracle备库查询报ORA-01187

一个多表关联的语句在备库执行查询时提示ORA-01187: cannot read from file because it failed verification tests&#xff0c;单独对某一个表查询则正常返回&#xff08;因为不需要排序等&#xff0c;没有用到临时表空间&#xff09;。 查看报错信息发现是提示的临时数据文件…