【STL学习之路】vector的使用

news2024/11/24 17:25:22

文章目录

  • vector介绍
  • vector使用
    • 一、构造函数
    • 二、迭代器
    • 三、vector增删查改
    • 关于STL中参数的分析(以push_back为例)
    • sort算法和仿函数使用

vector介绍

image-20221226175353302

vector就是顺序表的封装,是一个模板类,如上图所示。为方便vector里可以存任何数据类型,因此搞成了模板。

第一个参数是模板类型T,T可以是int,double,char等,也可以是其他class或者struct

第二个参数是一个空间配置器,(STL极致追求效率,向内存池来申请空间而不是直接向堆)。这个参数是缺省,一般不用管它。

vector使用

一、构造函数

构造函数接口说明
vector()无参构造
vector(size_type n,const value_type& val = value_type()构造并初始化n个val
vector(const vector& x)拷贝构造
vector(InputIterator first,InputIterator last)使用迭代器构造
1. 全缺省参数
    vector<int> vi;			
    vector<double> vd; 		 //调用全缺省构造
2. n个val构造
   vector<int> vi(5,0);		//用5个0构造
   char ch = 'x';
   vector<char> vc(100,ch);		//用100个ch构造
3. 拷贝构造
   vector<int> v1(5,10);
   vector<int> v2(v1);			//用已存在的v1构造
   
   vector<int> v3(vector<int>(10,6));		//匿名对象构造
4. 迭代器区间构造
   int arr[] = {1,2,3,4,5,6,7,8,9,10};
   int len = sizeof(arr)/sizeof(int);
   vector<int> v(arr,arr+len);           //arr的[0,len)构造

二、迭代器

Iterator的使用接口说明
begin + end获取第一个数据位置的迭代器 / 获取最后一个位置迭代器
rbegin + rend获取最后一个位置迭代器 / 获取第一个位置迭代器

image-20221226182419304

//1.普通迭代器
int arr[] = {1,2,3,4,5,6,7,8,9};
vector<int> v(arr,arr+sizeof(arr)/sizeof(int));
vector<int>::iterator it = v.begin();    //普通迭代器
vector<int>::cont_iterator c_it = v.begin();  //const迭代器
vector<int>::reverse_iterator r_it = v.rbegin();//reverse迭代器(反向)
vector<int>::const_reverse_iterator c_r_it = v.rbegin();//反向const迭代器
//使用方法都相同,以普通迭代器为例
while(it != v.end() )
{
    cout << *it << " ";
    ++it;
}
//注意 如果是反向迭代器必须使用rbegin和rend
while(r_it != v.rend()){ /* ... */ }

三、vector增删查改

vector增删查改接口说明
push_back尾插
pop_back尾删
insert再position前插入val
erase删除position位置的数据
swap交换两个vector的数据空间
operator[]像数组一样访问
findSTL算法(头文件:algorithm)
vector<int> v;
//插入元素
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5);
v.push_back(6);
v.push_back(7);    //v: 1 2 3 4 5 6 7
//删除元素
v.pop_back();
v.pop_back();       // v: 1 2 3 4 5

//  ↓  三种遍历方式
//遍历1:利用opertor[]
for(size_t i = 0;i<v1.size();++i)
{
    cout << v[i] <<" ";
}
cout << endl;
//遍历2:迭代器
vector<int>::iterator it = v.begin();
while (it != v.end())
{
    cout << *it << " ";
    ++it;
}
cout << endl;
//遍历3:范围for
//利用范围for遍历
for (auto e : v)
{
    cout << e << " ";
}
cout << endl;

/************************************/
/**         insert和 earse         **/
/************************************/
vector<int> v1;
v1.push_back(1);
v1.push_back(2);
v1.push_back(3);
v1.push_back(4);
v1.push_back(5);

//找到3的位置,在3的位置插入30 -- find使用迭代器
#include<algorithm>

vector<int>::iterator position = find(v1.begin(),v1.end(),3);
//如果找不到返回end()
if (position != v1.end())
{
    v1.insert(position,30);
}
//如果找不到就不用动

for (auto i : v1)
{
    cout << i << " ";
}
cout << endl;

/* 删除 */

//找到4并删除
position = find(v1.begin(), v1.end(), 4);
//如果找到了就删除
if (position != v1.end())
{
    v1.erase(position);
}
for (auto i : v1)
{
    cout << i << " ";
}
cout << endl;

关于STL中参数的分析(以push_back为例)

image-20221226203854865

push_back的参数是 const value_type& val

关键:1. 参数是引用 2. const。 为什么要这样设计?

  1. 使用引用:传递自定义类型的时候,自定义类型可能很大,所以用引用可以减少拷贝
  2. 使用const:传递匿名对象,或者直接传递参数返回值,必须要用const接收
//以string为例  那么参数类型对于的是 const string&
vector<string> v;
//1.最初是这样用:
string str = "hello"
v.push_back(str);		
//2.上面太麻烦,改用匿名对象
v.push_back(string("hello"));	//匿名对象具有常属性,const是必须
//3.隐式类型转换
v.push_back("hello");

sort算法和仿函数使用

sort算法:

image-20221226201812920

// sort第三个参数是一个仿函数,其实是一个类模板
// 缺省值是less类型 -> 升序
// 降序:greater类型
// less和greater都在 头文件中
// 但是如果只包含algorightm头文件,只能用less 因为包含了算法 就包含了排序 就可以用(排序默认是less) 但是没有包含greater类型

#include<vector>
#include<algorithm>
#include<functional>

vector<int> v1;
v1.push_back(3);
v1.push_back(5);
v1.push_back(1);
v1.push_back(4);
v1.push_back(2);
v1.push_back(6);
sort(v1.begin(), v1.end());	
for (auto i : v1)
{
    cout << i << " ";
}
cout << endl;
//打印 1 2 3 4 5 6

//定义仿函数对象
less<int> ls;
greater<int> gt;
sort(v1.begin(), v1.end(), gt);	//传递greater类型的仿函数-->降序

for (auto i : v1)
{
    cout << i << " ";
}
cout << endl;
//输出: 6 5 4 3 2 1

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

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

相关文章

ChatGPT 免账号使用

一.ChatGPT 简介 ChatGPT是人工智能研究实验室OpenAI新推出的一种人工智能技术驱动的自然语言处理工具&#xff0c;使用了Transformer神经网络架构&#xff0c;也是GPT-3.5架构&#xff0c;这是一种用于处理序列数据的模型&#xff0c;拥有语言理解和文本生成能力&#xff0c;尤…

搭建资金运营体系提高企业的运营能力

资金运营体系是以项目资金流管理为核心&#xff0c;在项目预核算体系基础上的深度化&#xff0c;是丰富和完善全面预算管理的重要内容。资金运营体系建设嵌入到业务流程和项目实施过程&#xff0c;将资金使用成本贯穿于项目实施各个环节。 一、资金管控总体思路 1、资金运营的…

数据可视化:春节临近,拥堵模式开启,你买好回家的车票了吗

哈喽&#xff0c;大家好&#xff0c;春节将近&#xff0c;想必大家也开始准备回家过年的事情了&#xff0c;春运即将开始&#xff0c;祝愿大家都能买到回家的车票。 想必大家对春运都不陌生&#xff0c;随着春节临近&#xff0c;全国各地也都先后开启了拥堵模式&#xff0c;下…

unity打android studio项目包运行时报错

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. 打开Cmd 进入打包的项目&#xff0c;如下 输入gradlew --warning-mode all 说的是在Build.gradle(project)的RepositoryHandler.jcenter()方法已弃用 改成mavenCentral()即可 …

【OpenCV-Python】教程:8-3 高动态范围 HDR

OpenCV Python HDR 【目标】 学习如何从曝光序列生成和显示HDR图像。使用曝光融合来合并曝光序列。 【理论】 高动态范围成像(HDRI或HDR)是一种用于成像和摄影的技术&#xff0c;用于再现比标准数字成像或摄影技术更大的动态范围的光度。虽然人眼可以适应广泛的光照条件&am…

软考中级软件设计师和系统集成项目管理工程师哪个更好考?

软件设计师&#xff1a; 计算机相关基础知识&#xff0c;常用数据结构和常用算法&#xff0c;C程序设计语言&#xff0c;以及C、Java中的一种程序设计语言&#xff0c;软件工程、软件过程改进和软件开发项目管理的基础知识&#xff0c;软件设计的方法和技术。 系统集成项目管…

【设计模式】软件开发原则

开闭原则&#xff08;OCP&#xff09; 定义&#xff1a;一个软件实体应当对扩展开放&#xff0c;对修改关闭。也就是说在设计一个模块的时候&#xff0c;应当使这个模块可以在不被修改的前提下被扩展&#xff0c;即使现在不修改源代码的情况下改变这个模块的行为。 意思&#x…

(包含源代码)2022年全国大学生数学建模竞赛E题目-小批量物料生产安排详解+思路+Python代码时序预测模型-补完

目录 前言 赛题分析 1.问题一 问题分析 物料频率 代码详细操作&#xff1a; 出现频次 需求总数 趋势标量 方法 平均每天需求额度 整合代码 熵权法 详细介绍&#xff1a; 二、使用步骤 2.计算指标信息熵 3.熵权法相关代码 得到权重&#xff1a; 只希望各位以…

决策树-sklearn

决策树 1.概述 1.1 决策树是如何工作 决策树能够从一系列有特征和标签的数据中总结出决策规则&#xff0c;并且使用树状图的结构来表现&#xff0c;从而达到解决回归和分类问题。通俗的说&#xff0c;就是我们只需要问一系列问题就可以对数据进行分类。 核心要解决的问题&am…

20221226编译Toybrick的TB-RK3588X开发板的Android12系统3

20221226编译Toybrick的TB-RK3588X开发板的Android12系统3 2022/12/26 18:27 编译指令&#xff1a; 1、cat android12-rk3588.tar.gz.* >android12-rk3588.tar.gz 2、tar -zxvf android12-rk3588.tar.gz,解压缩后生成android12-rk3588-new目录 3、android12-rk3588-new 4、…

CSS篇.day04-单位,流式布局,弹性布局(flex),网格布局,渐变,变形与过渡

目录 1. 单位 2.流式布局 3.弹性布局(flex) 4.网格布局 5.渐变 6.变形与过渡 1. 单位 px: 绝对单位 像素em: 相对单位 基准点为父节点字体大小 若自身定义了font-size按自身来计算(一般浏览器默认16px)rem: 相对单位 相对根节点html的字体大小, css3新增属性, 根元…

【Python百日进阶-数据分析】Day139 - plotly甘特图:plotly.figure_factory.create_gantt()

文章目录一、语法二、参数三、返回值四、实例4.1 普通ff甘特图4.2 将任务组合在一起4.3 按数值变量着色4.4 create_gantt4.5具有数字条目的按列索引4.6 具有字符串条目的按列索引4.7 使用颜色字典4.8一、语法 已弃用&#xff0c;请用plotly.express.timeline()代替。 plotly.…

LeetCode88. 合并两个有序数组

题目 给你两个按非递减顺序排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。请你合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按非递减顺序排列。 注意&#xff1a;最终&#xff0c;合并后数组不…

统一观测|如何使用 Prometheus 监控 Windows

作者&#xff1a; 颍川 引言 微软 Windows 是当前主流操作系统之一&#xff0c;在桌面和服务端均有较大市场份额。 对于 Linux 操作系统&#xff0c;Prometheus 可以通过 Node Exporter 来进行基础资源&#xff08;CPU、内存、磁盘、网络等&#xff09;监控&#xff0c;类似…

吴恩达的2022年终盘点:生成式AI、ViT、大模型

昨日&#xff0c;**吴恩达在圣诞节的《The Batch》特刊上发布了一年一度的年终盘点。**在过去的一年&#xff0c;生成式AI迎来爆发式增长&#xff0c;由人工智能生成的图片在社交平台疯狂传播&#xff0c;引发大量争议的同时也推动了投资&#xff1b;视觉 Transformer(ViT) 的工…

【nowcoder】笔试强训Day8

目录 一、选择题 二、编程题 2.1两种排序方法 2.2最小公倍数 一、选择题 1.下列选项中关于Java中super关键字的说法正确的是&#xff08;&#xff09; A super关键字是在子类对象内部指代其父类对象的引用 B super关键字不仅可以指代子类的直接父类&#xff0c;还可以直…

SpreadJS 16新建文件格式,Data Manager中的层次结构

SpreadJS 16新建文件格式,Data Manager中的层次结构 为TableSheet、Designer、Calculation、Shape和Workbook添加增强功能。 2022年12月22日-16:53新版本 特征 新建文件格式 新的.sjs文件格式使ExcelIO进程更快、更小。 表页增强功能 Data Manager中的层次结构。 Data Manager字…

【代码随想录】链表-golang

链表 from 代码随想录 移除链表元素 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 思路&#xff1a;设置一个新的节点&#xff0c;节点的下一个是链表的第一个节点 /*** Definition f…

阿根廷夺冠早已预判,梅西经济爆火,这款产品在跨境电商卖断货了

2022年12月18日23:00&#xff0c;世界杯的决赛将举行&#xff0c;阿根廷会战法国&#xff1b;期间&#xff0c;梅西和姆巴佩也将会在绿茵场上狭路相逢。而作为现役名声最为响亮的球星之一&#xff0c;此次卡塔尔也是梅西最后一次征战世界杯赛场&#xff0c;同时&#xff0c;随着…

基于Python实现电影推荐系统【100010052】

电影推荐系统 标签&#xff1a;Tensorflow、矩阵分解、Surprise、PySpark 1、用Tensorflow实现矩阵分解 1.1、定义one_batch模块 import numpy as np import pandas as pddef read_and_process(filename, sep ::):col_names [user, item, rate, timestamp]df pd.read_cs…