C++ STL之vector容器

news2024/11/25 0:41:40

目录

一、vector容器的介绍

二、vector容器的使用

1.vector的构造函数

2.vector的赋值操作

3.vector的容量与大小

4.vector的插入和删除

5.vector的数据存取

6.vector的互换容器

7.算法模块在vector的应用

①find算法(std)

②sort算法(std)


一、vector容器的介绍

引用的头文件:#include<vector>

vector是C++ STL中的一个容器,它是一个动态数组,可以进行元素的插入和删除,在此过程中,vector会动态调整所占用的内存空间,整个过程无需手动干预。vector容器是一个封装了动态大小数组的顺序容器能够存放各种类型的对象(包括自定义类型)。vector容器中的元素按照严格的线性顺序排序。vector容器的空间是动态增长的。

能够存放各种类型的对象:

如:vector<string> v1;

       vector<list<int>> v2;

       vector<string> s = {"a", "aa", "aaa"};

动态增长:当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。就时间而言,这是一个相对代价高的任务,因为每当一个新的元素加入到容器的时候,vector并不会每次都重新分配大小。

按照严格的线性顺序排序:允许使用容器时,进行随机访问。

通常,使用 vector 容器是最好的选择,除非你有很好的理由选择其他容器。

二、vector容器的使用

1.vector的构造函数

vector<T>; // 使用模板类,默认构造函数
vector<T>{a, b, c, ...}; // 包含了初始值个数的元素
vector<T> = {a, b, c, ...}; // 等价于vector<T>{a, b, c, ...};
vector<T>(v.begin(), v.end()); // 将[v.begin(),v.end())区间中的元素拷贝给本身
vector<T>(n, elem); // 将n个elem拷贝给本身
vector<T>(const vector &v); // 拷贝构造函数

使用如下:

// ...
using namespace std;
// ...
void PrintVector(const vector<int>& v)
{
	for (auto& e : v)
	{
		cout << e << " ";
	}
}
// ...
vector<int> v1;
vector<int> v2(4, 2);
vector<int> v3(v2);
vector<int> v4{1, 2, 3, 4, 5};
PrintVector(v3);
// ...

输出结果:

2
2
2
2

2.vector的赋值操作

vector& operator=(const vector &v); // 重载赋值运算符
assign(v.begin(),v.end()); // 将[v.begin(),v.end())区间中的元素赋值给本身
assign(n,elem); // 将n个elem赋值给本身

使用如下:

void text02()
{
	vector<int> v1,v2;
	for (int i = 0; i < 5; ++i)
	{
		v1.push_back(i);
	}
	v2 = v1;                         // 赋值运算符重载
	vector<int> v3,v4;
	v3.assign(v1.begin(), v1.end()); // 区间赋值
	v4.assign(5, 9);
	cout << "打印v2: ";
	PrintVector(v2);
	cout << "打印v3: ";
	PrintVector(v3);
	cout << "打印v4: ";
	PrintVector(v4);
}

3.vector的容量与大小

empty();
 // 判断容器是否为空,为空返回1,否则返回0

capacity();
 // 返回容器的容量

size();
 // 返回容器的大小,即容器中元素的个数

reserve();
 // 预分配vector的内存空间大小

resize(int num);
 // 改变vector的size为num,若容器变长,则以默认值0填充新位置,如果容器变短,则末尾超过容器长度的元素被删除

resize(int num,int elem);
 // 改变vector的size为num,若容器变长,则以elem填充新位置,如果容器变短,则末尾超过容器长度的元素被删除

注:

reserve函数若分配小于当前的容量大小则不进行任何操作。

注:capacity的代码在 vs 和 g++ 下分别运行会发现,vs下capacity是按1.5倍增长的,g++是按2倍增长的。这个问题经常会考察,不要固化的认为,顺序表增容都是2倍,具体增长多少是根据具体的需求定义的。vs是PJ版本STL,g++是SGI版本STL。 

4.vector的插入和删除

push_back(elem); // 尾部插入元素elem
pop_back(); // 删除最后一个元素
insert(const_iterator pos, elem); // 在迭代器指向的位置pos处插入一个元素elem
insert(const_iterator pos, int count, elem); // 在迭代器指向的位置pos处插入count个元素elem
erase(const_iterator pos); // 删除迭代器指向的元素
erase(const_iterator begin, const_iterator end); // 删除迭代器[begin, end)之间的元素
clear(); // vector的size将变成0,但是它的容量capacity并未发生改变

迭代器:

迭代器失效问题:

会引起其底层空间容量改变的操作,都有可能是迭代器失效,比如:resize、reserve、insert、assign、push_back等。

注意更新迭代器变量

使用如下:

//...
vector<int> v4{ 1, 2, 3, 4, 5, 6, 7, 8, 9 };
v4.push_back(10);
v4.push_back(11);

v4.pop_back();
v4.pop_back();

v4.insert(v4.begin() + 1, 3,345);
v4.erase(v4.begin() + 7, v4.end());

PrintVector(v4);
//...

输出结果:

1 345 345 345 2 3 4

5.vector的数据存取

at(int idx); // 返回索引idx所指的数据
operator[];  // 返回[]内索引所指的数据
front();     // 返回容器中第一个元素
back();      // 返回容器中最后一个元素

6.vector的互换容器

swap(v); // 容器v和当前容器互换

7.算法模块在vector的应用

①find算法(std)

template<class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& val)
{
	while (first != last)
	{
		if (*first == val) return first;
		++first;
	}
	return last;
}

注:find未找到,则返回迭代器类型对象v.end()。

代码演示:

//...
vector<int> v4{ 9, 8, 7, 10, 6, 5, 4, 11, 3, 2, 1 };
v4.insert(v4.begin() + 1, 2,345);
vector<int>::iterator pos = find(v4.begin(), v4.end(), 4);
if (pos != v4.end())
{
	v4.erase(pos);
}
PrintVector(v4);
//...

输出结果:

9 345 345 8 7 10 6 5 11 3 2 1

②sort算法(std)

引用的头文件:#include<algorithm>

default (1):
template <class RandomAccessIterator>
void sort (RandomAccessIterator first, RandomAccessIterator last);

custom (2):
template <class RandomAccessIterator, class Compare>
void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

 代码演示:

//...
vector<int> v4{ 9, 8, 7, 10, 6, 5, 4, 11, 3, 2, 1 };
v4.insert(v4.begin() + 1, 2,345);
vector<int>::iterator pos = find(v4.begin(), v4.end(), 4);
if (pos != v4.end())
{
	v4.erase(pos);
}

sort(v4.begin(), v4.end());
PrintVector(v4);
//...

输出结果:

1 2 3 5 6 7 8 9 10 11 345 345

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

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

相关文章

07 - 进程创建大盘点

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录 1. 进程创建回顾2. 再论进程创建2.1 思考2.2 vfork()深度分析2.3 vfork()要点分析2.4 fork()的现代优化2.5 编程实验&#xff1a;fork() &…

【安卓源码】Binder机制2 -- addService 流程

0、binder 进程间通信原理 一次完整的 Binder IPC 通信过程通常是这样&#xff1a; 首先 Binder 驱动在内核空间创建一个数据接收缓存区&#xff1b; 接着在内核空间开辟一块内核缓存区&#xff0c;建立内核缓存区和内核中数据接收缓存区之间的映射关系&#xff0c;以及内核中…

PHP入门【1】环境搭建

目录 一&#xff0c;安装appserv组合包 二&#xff0c;运行第一个php程序 一&#xff0c;安装appserv组合包 组合包&#xff1a;将apache&#xff0c;mysql&#xff0c;php等服务器软件和工具安装配置完成后打包处理 组合包大大提高了我们的效率&#xff0c;不需要为配置环境…

Linux服务器出现503 服务不可用错误怎么办?

​  HTTP 503 服务不可用错误代码表示网站暂时不可用。无论您是网站访问者还是管理员&#xff0c;503 页面都很麻烦。尽管该错误表明存在服务器端问题&#xff0c;但对于访问者和网络管理员来说&#xff0c;有一些可能的解决方案。本文将解释Linux服务器出现503 服务不可用错…

PowerShell Studio 2023 Crack

PowerShell Studio 2023 Crack SAPIEN Script Packager为MSI Builder添加了ARM64平台支持。 增加了对Microsoft PowerShell 7.2.11和7.3.4的支持。 WiX工具集已更新到3.14。 PowerShell Studio 2023 Crack是可用的功能最强大、功能最完整的PowerShell集成脚本环境(ISE)之一。更…

通达信VCP形态选股公式,憋了好几天才写出来

VCP形态的英文”Volatility Contraction Pattern”的缩写&#xff0c;意思是“波动收缩形态”。VCP形态是全美交易冠军马克米勒维尼的核心交易模式之一&#xff0c;在其著作《股票魔法师》中有详细介绍。 马克米勒维尼把VCP形态比喻为湿毛巾&#xff0c;拧过一次后仍含水&…

动态链接库的链接和运行

本文对动态链接库的链接和运行进行一个总结&#xff0c;为什么要分开说呢&#xff1f;因为链接通过生成可执行文件并不代表运行时能找到依赖的动态库。这与静态库是不一样的&#xff0c;因为静态库在编译完成后会库会编译到可执行程序中&#xff0c;但是动态链接库则不然&#…

最新研究:可审计的具有拜占庭鲁棒的联邦学习方案

本人新论文&#xff0c;可免费下载&#xff1a;https://download.csdn.net/download/liangyihuai/87727720 Y. Liang, Y. Li and B. -S. Shin, “Auditable Federated Learning With Byzantine Robustness,” in IEEE Transactions on Computational Social Systems, doi: 10.…

【Unity3D日常开发】Unity3D中实现UI擦除效果、刮刮卡功能

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 使用Unity3D实现UI的擦拭效果、刮刮卡功能的效果实现方式比较多…

Python基于Pytorch Transformer实现对iris鸢尾花的分类预测,分别使用CPU和GPU训练

1、鸢尾花数据iris.csv iris数据集是机器学习中一个经典的数据集&#xff0c;由英国统计学家Ronald Fisher在1936年收集整理而成。该数据集包含了3种不同品种的鸢尾花&#xff08;Iris Setosa&#xff0c;Iris Versicolour&#xff0c;Iris Virginica&#xff09;各50个样本&am…

BatchNormalization和LayerNormalization的理解、适用范围、PyTorch代码示例

文章目录 为什么要NormalizationBatchNormLayerNormtorch代码示例 学习神经网络归一化时&#xff0c;文章形形色色&#xff0c;但没找到适合小白通俗易懂且全面的。学习过后&#xff0c;特此记录。 为什么要Normalization 当输入数据量级极大或极小时&#xff0c;为保证输出数…

【算法基础】直接插入排序 + 希尔排序

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前正在学习c和算法 ✈️专栏&#xff1a;【C/C】算法 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章有啥瑕疵 希望大佬指点一二 如果文章对你有…

基于人类反馈的强化学习(RLHF)在LLM领域是如何运作的?

基于人类反馈的强化学习在LLM领域是如何运作的&#xff1f; 为什么需要强化学习RLHFPre-training modelReward ModelFine-tune with RL 参考 为什么需要强化学习 指标无法衡量。在过去的nlp任务中&#xff0c;词性标注、机器翻译、语义判别等任务是nlp任务的主力军&#xff0c…

Hytrix原理

这里写目录标题 Hytrix容错机制熔断资源隔离线程池隔离信号量隔离 服务降级请求缓存请求合并 Hystrix流程图 Hytrix容错机制 熔断 在一个统计时间窗口&#xff08;HYST rixCommandProperties.metricsRollingStatisticalWindowInMilliseconds()&#xff09;内&#xff0c;处理…

转化率双倍暴涨——客户自助服务门户

近年来&#xff0c;社交媒体的兴起使客户负责品牌对话。随着电子商务和在线帮助需求的扩大&#xff0c;公司必须满足并超越新的期望&#xff0c;以保持客户满意度。 通过SaleSmartly&#xff08;ss客服&#xff09;自动化流程功能建立客户自助服务是一种双赢的决策&#xff0c…

Ajax XHR响应

文章目录 AJAX 服务器 响应服务器响应responseText 属性responseXML 属性 AJAX 服务器 响应 服务器响应 如需获得来自服务器的响应&#xff0c;请使用 XMLHttpRequest 对象的 responseText 或 responseXML 属性。 属性描述responseText获得字符串形式的响应数据。responseXML…

2015年下半年软件设计师下午试题

试题一 【说明】 某慕课教育平台欲添加在线作业批改系统&#xff0c;以实现高效的作业提交与批改&#xff0c;并进行统计。学生和讲师的基本信息已经初始化为数据库中的学生表和讲师表。系统的主要功能如下&#xff1a; 提交作业。验证学生标识后&#xff0c;学生将电子作业通…

Ajax 数据库

文章目录 AJAX Database 实例AJAX 数据库实例实例解释 showCustomer() 函数AJAX 服务器页面 AJAX Database 实例 AJAX 可用来与数据库进行动态通信。 AJAX 数据库实例 下面的例子将演示网页如何通过 AJAX 从数据库读取信息&#xff1a; 请在下面的下拉列表中选择一个客户&…

【wpf】转换器 Converter

今天积攒了一个转换器的用法&#xff0c;分享给各位。 我们经常会有这种需求&#xff1a; 某些控件有时需要显示&#xff0c;有时需要隐藏&#xff0c;比如&#xff1a; 那&#xff0c;我就想通过一个bool变量和是否显示绑定。 但是我们知道&#xff0c;是否显示&#xff0c;…

nssctf web

[BJDCTF 2020]easy_md5 测试发现输入的内容会通过get传递但是没有其他内容 观察一下响应头 我们看到了 select * from admin where passwordmd5($pass,true) 这里的md5(string,raw) 这里的string应该清楚就是字符串&#xff0c;是必选参数 raw是可选参数 默认不写为FA…