【C++】STL之vector操作

news2024/9/27 11:00:18

文章目录

  • 简介
    • 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.coloradmin.cn/o/1026242.html

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

相关文章

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

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

数据挖掘note(1)

数据挖掘一般分为机器学习和统计学习&#xff0c;大数据学的课程一般是关于机器学习&#xff0c;我们学的浅&#xff0c;主要关于统计学习&#xff0c;示意图如下所示&#xff1a; 这是一个大数据时代&#xff0c;但是数据挖掘的利用率不足0.5%&#xff0c;可见数据挖掘的空间巨…

全国各地演讲口才培训机构信息那么多需要如何选择?

演讲口才是一项非常重要的能力&#xff0c;它不仅可以帮助我们在职场中更好地表达自己&#xff0c;还可以在公共场合中更好地展示自己的个性和魅力。因此&#xff0c;越来越多的人开始关注演讲口才的培训&#xff0c;而全国各地也涌现出了众多的演讲口才培训机构。 选择适合自己…

ReactNative中升级IOS 17版本Crash解决

ReactNative中升级IOS 17版本Crash解决 ReactNative中升级IOS 17版本Crash解决一、问题描述二、原因分析三、解决方案决策3.1 设置宽高为非零值3.2 使用新的UIGraphicsImageRenderer替换就版本的UIGraphicsBeginImageContext 四、可能使用到该API的三方库4.1 react-native-fast…

RK3568开发板SG90 舵机模块的功能实现-迅为电子

1 模块说明 SG90 舵机模块如下图所示: 常见的舵机转向角度有 0-90 度&#xff0c;0-180 度&#xff0c;0-360 度&#xff0c;可以用在垃圾桶项目开盖用&#xff0c;智能小车的全比例转向&#xff0c;摄像头云台&#xff0c;机械臂等。 2 接线说明 SG90 舵机模块上三条线&…

猫头虎博主成为创作者的第1024天纪念日

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Unity制作曲线进度条

unity制作曲线进度条 大家好&#xff0c;我是阿赵。   在使用Unity引擎做进度条的时候&#xff0c;有时会遇到一个问题&#xff0c;如果进度条不是简单的横向、纵向或者圆形&#xff0c;而是任意的不规则形状&#xff0c;那该怎么办呢&#xff1f;比如这样的&#xff1a; 一…

【JDK 8 -收集和统计】7.1 collector 收集器

一、collect&#xff08;&#xff09;方法 二、两个重载方法 2.1 方法一 2.2 方法二&#xff08;常用&#xff09; 三、Collector 的 作用 四、Collectors 的作用 > Collectors.toList() > Collectors.toMap() > Collectors.toSet() > Collectors.toColl…

基于深度强化学习的四旋翼无人机航线跟随

源自&#xff1a;指挥与控制学报 作者&#xff1a;杨志鹏 李波 甘志刚 梁诗阳 “人工智能技术与咨询” 发布 摘 要 针对无人机在空中执行航线跟随任务时无法对未知环境作出合理应对措施等问题, 提出了一种基于深度强化学习的四 旋翼无人机航线跟随方法. 通过无人机受力…

牛客: BM17 二分查找-I

牛客: BM17 二分查找-I 文章目录 牛客: BM17 二分查找-I题目描述题解思路题解代码 题目描述 题解思路 一个左端点, 一个右端点, 循环直到左右端点交叉, 取左右端点的中点 若中点的值大于目标值, 意味着目标值只可能在中点的左边, 所以右端点变为中点的前一个位置 若中点的值…

机器学习第九课--随机森林

一.什么是集成模型 对于几乎所有的分类问题(图像识别除外&#xff0c;因为对于图像识别问题&#xff0c;目前深度学习是标配)&#xff0c;集成模型很多时候是我们的首选。比如构建一个评分卡系统&#xff0c;业界的标配是GBDT或者XGBoost等集成模型&#xff0c;主要因为它的效…

让开源数据开发平台助力提质增效!

用低代码技术平台&#xff0c;可以提高办公协作效率&#xff0c;可以让数据资源变得更有意义和价值&#xff0c;也可以为企业做出更理想的发展决策。作为开源数据开发平台服务商&#xff0c;流辰信息谨守研发初心&#xff0c;一直在低代码技术平台领域努力耕耘&#xff0c;为行…

[Linux入门]---yum软件安装及vim编辑器配置

文章目录 1.Linux软件安装包2.如何安装软件注意事项下载rzsz查看rzsz软件包安装or卸载软件原理 3.简单配置配置文件常用配置选项&#xff08;测试&#xff09;使用插件使用链接配置 1.Linux软件安装包 Linux的三种软件安装方法&#xff1a; ①源代码安装。 在Linux系统下载程序…

【C++】动态内存管理 ③ ( C++ 对象的动态创建和释放 | new 运算符 为类对象 分配内存 | delete 运算符 释放对象内存 )

文章目录 一、C 对象的动态创建和释放1、C 语言 对象的动态创建和释放 的方式2、C 语言 对象的动态创建和释放 的方式 二、代码示例 - 对象的动态创建和释放 一、C 对象的动态创建和释放 使用 C 语言中的 malloc 函数 可以为 类对象 分配内存 ; 使用 free 函数可以释放上述分配…

Redis的介绍以及简单使用

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

二叉搜索树(BST,Binary Search Tree)

文章目录 1. 二叉搜索树1.1 二叉搜索树概念1.2 二叉搜索树的查找1.3 二叉搜索树的插入1.4 二叉搜索树的删除 2 二叉搜索树的实现3 二叉搜索树的应用3.1二叉搜索树的性能分析 1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xf…

Hive行转列[一行拆分成多行/一列拆分成多列]

场景&#xff1a; hive有张表armmttxn_tmp&#xff0c;其中有一个字段lot_number&#xff0c;该字段以逗号分隔开多个值&#xff0c;每个值又以冒号来分割料号和数量&#xff0c;如&#xff1a;A3220089:-40,A3220090:-40,A3220091:-40,A3220083:-40,A3220087:-40,A3220086:-4…

LIN - 基础

LIN - 基础 概念CAN/LIN 物理层数据链路层帧格式 概念 原理 基于UART数据格式、主从结构 串行通讯 拓扑 LIN网络中有且只有一个主节点&#xff0c;其他都是从节点 优缺点 功能简单 实时性低 成本低 单主多从&#xff0c;不存在冲突&#xff0c;无需仲裁 主任务/从任务 主任务&…

电脑出现找不到msvcp120.dll无法继续执行代码,不用担心多种方法帮你搞定

今天&#xff0c;我想和大家分享的文章是“msvcp120.dll丢失的修复方法”。我相信&#xff0c;对于我们很多人来说&#xff0c;电脑是我们学习、娱乐的重要工具&#xff0c;而当电脑出现问题时&#xff0c;我们往往束手无策。因此&#xff0c;我希望通过今天的文章&#xff0c;…

笔记-搭建和使用docker-registry私有镜像仓库

笔记-搭建和使用docker-registry私有镜像仓库 拉取/安装registry镜像 和 对应的ui镜像 如果有网络可以直接拉取镜像 docker pull registry docker pull hyper/docker-registry-web没有网络可以使用我导出好的离线镜像tar包, 下载地址https://wwzt.lanzoul.com/i3im1194z12d …