STL之Vector容器

news2024/11/23 11:44:51

 容器

容器的分类

序列式容器(Sequence containers)
- 每个元素都有固定位置--取决于插入时机和地点和元素值无关

- vector、deque、list、stack、queue

关联式容器(Associated containers)
- 元素位置取决于特定的排序准则,和插入顺序无关

- set、multiset、map、multimap

数据结构描述实现头文件
向量(vector)连续存储的元素<vector>
列表(list)由节点组成的双向链表,每个结点包含着一个元素-<list>
双队列(deque)连续存储的指向不同元素的指针所组成的数组<deque>
集合(set)由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序<set>
多重集合(multiset)允许存在两个次序相等的元素的集合<set>
栈(stack)后进先出的值的排列<stack>
队列(queue)先进先出的执的排列<queue>
优先队列(priority_queue)元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列<queue>
映射(map)由{键,值}对组成的集合,以某种作用于键对上的谓词排列<map>
多重映射(multimap)允许键对有相等的次序的映射<map>

vector容器

vector是将元素置于一个幼态数组中加以管理的容器。

vector可以随机存取元素(支持索引值直接存取,用0操作符或at()方法)

vector尾部添加或移除元素非常快速。但是在中部或头部插入元素或移除元素比较费时

vector对象的默认构造

vector采用模板类实现,vector对象的默认构造形式

vector对象的带参数构造

- vector(beg,end); //构造函数将[beg,end)区间中的元素拷贝给本身。注意该区间是左闭右开的区间。
- vector(n,elem); //构造函数将n个elem拷贝给本身。
- vector(const vector &vec);//拷贝构造函数

示例:

#include<iostream>
#include<vector>
using namespace std;
int main() {
	vector<int> vecInt;
	vector<float> vecFloat;
	vector<string> vecString;
	int iarr[] = { 1,2,3,4,5 };
	vector<int> v1(iarr, iarr + 5);

	vector<int> v2(3, 10);//存储3个10
	for (int i = 0; i < 3; i++) {
		cout << v2[i] << " ";
	}
	cout << endl;

	vector<int> v3(v1);//将v1拷贝到v3里
	for (int i = 0; i < 5; i++) {
		cout << v3[i] << " ";
	}
	cout << endl;
}

vector的赋值

- vector.assign(beg,end); //将[beg,end)区间中的数据拷贝赋值给本身。注意该区间是左闭右开的区间

- vector.assign(n,elem); //将n个elem拷四赋值给本身。

- vector& operator=(const vector &vec); //重载等号操作符

- vectorswap(vec); //将vec与本身的元素互换。

示例:

#include<iostream>
#include<vector>
using namespace std;
int main() {
	vector<int> vecIntA(10,10);
	vector<int> vecIntB, vecIntC, vecIntD;

	//vector.assign(beg,end)
	int iArray[] = { 0,1,2,3,4 };
	vecIntA.assign(iArray, iArray + 5);
	for (int i = 0; i < 5; i++) {
		cout << vecIntA[i] << " ";
	}
	
	cout << endl;
	cout << vecIntA.size() << endl;
	//assign是覆盖而并不是简单的赋值
	
	vecIntB.assign(vecIntA.begin(), vecIntA.end());
	/*vecIntB = { 1,2,3,4 };
	cout << vecIntB.size() << endl;*/
	for (int i = 0; i < 5; i++) {
		cout << vecIntB[i] << " ";
	}
	cout << endl;

	//- vector.assign(n,elem); //将n个elem拷四赋值给本身。
	vecIntC.assign(4, 10);
	for (int i = 0; i < 4; i++) {
		cout << vecIntC[i] << " ";
	}
	cout << endl;

	//vectorswap(vec); //将vec与本身的元素互换
	vecIntB.swap(vecIntC);
	for (int i = 0; i < vecIntB.size(); i++) {
		cout << vecIntB[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < vecIntC.size(); i++) {
		cout << vecIntC[i] << " ";
	}
	cout << endl;

	//vector& operator=(const vector &vec); 
	vecIntD = { 1,1,1,1,1,1 };
	vecIntD = vecIntC;
	for (int i = 0; i < vecIntD.size(); i++) {
		cout << vecIntD[i] << " ";
	}
	cout << endl;
}

vector的大小

- vector.size(); //返回容器中元素的个数
- vector.empty0;//判断容器是否为空
- vector.resize(num); //重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短则末尾超出容器长度的元素被删除。
- vector.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。

示例:

#include<iostream>
#include<vector>
using namespace std;
int main() {
	vector<int> v1;
	cout << "v1.size=" << v1.size() << endl;
	if (v1.empty()) {
		cout << "v1 is empty" << endl;
	}

	int iArray[] = { 0,1,2,3,4 };
	v1.assign(iArray, iArray + 5);
	v1.resize(3);
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;
	cout << "v1.size=" << v1.size() << endl;

	v1.resize(7);
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;
	cout << "v1.size=" << v1.size() << endl;
	
	//将容器的长度变长,并且扩展出来的新的元素赋值为指定的值
	v1.resize(10, 100);
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;
	cout << "v1.size=" << v1.size() << endl;
}

vector的访问方式

- vec.at(idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_rdnge异常。

- vec[idx]; //返回索引idx所指的数据,越界时,运行直接报错

示例:

#include<iostream>
#include<vector>
using namespace std;
int main() {
	int a[] = { 1,2,3,4 };
	vector<int> v1(a, a + 4);
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;
	v1.at(8) = 100;
}

注:用下标法访问可以正常读写,但使用at()会报错,并终止程序,用下表法访问的时候不要下标越界,否则会访问不属于vector容器所定义的空间,造成不必要的数据错误修改

        

当code后面的数不是0时,代表有异常报错

Vector的插入

理论知识
- vector.insert(pos,elem); //在pos位置插入一个elem元素的拷贝,返回新数据的位置,

- vectorinsert(pos,n,elem); //在pos位置插入n个elem数据,无返回值,

- vector.insert(pos,beg,end); //在pos位置插入[beg,end)区间的数据,无返回值

vector末尾的添加移除操作

- vector <int> veclnt;

- vecint.push_back(); //在容器尾部加入一个元素.

- vecint.pop_back();//删除容器末尾元素

示例:

#include<iostream>
#include<vector>
using namespace std;
int main() {
	int a[] = { 1,2,3,4 };
	vector<int> v1(a, a + 4);
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;
	//从末尾插入一个元素
	v1.push_back(10);
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;

	//删除末尾元素
	v1.pop_back();
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;

	//插入元素
	v1.insert(v1.begin() + 3, 100);
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;

	//在指定的位置插入多个元素
	v1.insert(v1.begin() + 3,3, 100);
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;

	//在指定的位置插入多个元素
	v1.insert(v1.begin() + 3, a, a+4);
	for (int i = 0; i < v1.size(); i++) {
		cout << v1[i] << " ";
	}
	cout << endl;
}

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

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

相关文章

ARADEX伺服驱动器电源维修G565 D565/60 M5ref

伺服驱动器维修常见故障&#xff1a;无显示、缺相、过流、过压、欠压、过热、过载、接地、参数错误、有显示无输出、模块损坏。我们本着诚信待人的宗旨&#xff0c;凭借娴熟的技术和丰富的维修经验&#xff0c;为国内外诸多企业修了各种不同的伺服电机、驱动器和电源。 短路保…

SpringBoot - 广场舞团

专业团队&#xff0c;咨询就送开题报告&#xff0c;欢迎留言私信 摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各…

Web 安全基础教程:从零基础入门到精通

一、Web 安全概述 &#xff08;一&#xff09;Web 安全的定义与重要性 1.定义 Web 安全是指保护 Web 应用程序免受各种网络威胁&#xff0c;确保 Web 服务的保密性、完整性和可用性。在当今数字化时代&#xff0c;Web 应用广泛存在于各个领域&#xff0c;从电子商务到社交媒…

Vue2 qrcode+html2canvas 实现二维码的生成和保存

1.安装 npm install qrcode npm install html2canvas 2.引用 import QRCode from qrcode import html2canvas from html2canvas 效果&#xff1a; 1. 二维码生成&#xff1a; 下载二维码图片&#xff1a; 二维码的内容&#xff1a; 实现代码&#xff1a; <template>…

Linux进程优先级

&#x1f4dd;目录 &#x1f31f; 查看进程信息&#x1f31f; PRI and NI 风过无痕 忘川如斯 如日方升 策引千问 &#x1f31f; 查看进程信息 ps -l命令 UID : 代表执行者的身份PID : 代表这个进程的代号PPID &#xff1a;代表这个进程是由哪个进程发展衍生而来的&#xff0c…

二维码模组扫码器C#实现串口自动监听功能

C# Demo&#xff0c;调用二维码模块的tx_windows_hidpos.dll扫码库&#xff0c;支持QR-M20 、QR-M10、QR-M30等二维码型号。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Text; using…

超级好用的化妆神器,一键迁移妆容,觉得别人化妆真好看,看我一键迁移到自己的脸上!(附工作流)

这两天开源社区又出了一个比较有趣的ComfyUI 插件&#xff0c;功能很简单&#xff0c;可以实现妆容的一键迁移。 操作也很简单&#xff0c;只需要上传一张带有妆容的人物照片&#xff0c;再上传一张想要迁移妆容的照片&#xff0c;就可以把参考人物的妆容迁移到想要迁移的人物…

深入分析计算机网络性能指标

速率带宽吞吐量时延时延带宽积往返时间RTT利用率丢包率图书推荐内容简介作者简介 速率 连接在计算机网络上的主机在数字信道上传送比特的速率&#xff0c;也称为比特率或数据率。 基本单位&#xff1a;bit/s&#xff08;b/s、bps&#xff09; 常用单位&#xff1a;kb/s&#x…

大模型能否真正理解上下文?

人工智能咨询培训老师叶梓 转载标明出处 尽管对LLMs的评估涵盖了自然语言处理&#xff08;NLP&#xff09;的各个领域&#xff0c;但对它们理解上下文特征的语言能力的探讨却相对有限。为了填补这一空白&#xff0c;乔治城大学和苹果公司的研究者们共同提出了一种新的上下文理解…

HW行动指南,前辈教你如何真正靠护网赚到钱!

‍正文&#xff1a; HW行动&#xff0c;攻击方的专业性越来越高&#xff0c;ATT&CK攻击手段覆盖率也越来越高&#xff0c;这对于防守方提出了更高的要求&#xff0c;HW行动对甲方是一个双刃剑&#xff0c;既极大地推动了公司的信息安全重视度和投入力量&#xff0c;但同时…

【目标检测数据集】水泥搅拌车数据集2165张VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2165 标注数量(xml文件个数)&#xff1a;2165 标注数量(txt文件个数)&#xff1a;2165 标注…

【LeetCode】每日一题 2024_9_14 从字符串中移除星号(模拟)

前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动&#xff01; 今天的题目曾经的我做过了 . . . 又是复习的一天 题目&#xff1a;从字符串中移除星号 代码与解题思路 func removeStars(s string) string {// 本题的核心&#xff1a;生成的输入保证总是可以执行题面中…

ImportError: DLL load failed while importing _ssl: 找不到指定的模块的解决方法

ImportError: DLL load failed while importing _ssl: 找不到指定的模块的解决方法 现象解决办法 现象 在命令行中&#xff0c;可以正常导入_ssl模块&#xff0c;如下&#xff1a; Python 3.9.0 (default, Nov 15 2020, 08:30:55) [MSC v.1916 64 bit (AMD64)] :: Anaconda, …

【Qt | QLineEdit】Qt 中使 QLineEdit 响应 鼠标单击、双击事件 的两个方法

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a; 2024-09-14 …

做外贸为什么要做谷歌seo?

跟国内不同&#xff0c;购物有多个大平台可供选择&#xff0c;在海外是有很多人会在谷歌搜索上寻找自己想要的产品或者服务的&#xff0c;海外谷歌那是真正的老大哥&#xff0c;你想要的都能搜到&#xff0c;而谷歌的流量以及准确性&#xff0c;都不是国内以及购物平台可以比拟…

Vue组合式API:setup()函数

1、什么是组合式API Vue 3.0 中新增了组合式 API 的功能&#xff0c;它是一组附加的、基于函数的 API&#xff0c;可以更加灵活地组织组件代码。通过组合式 API 可以使用函数而不是声明选项的方式来编写 Vue 组件。因此&#xff0c;使用组合式 API 可以将组件代码编写为多个函…

H3C CAS系列开篇之CAS初认识

一、前言 基于信创需要,某项目中的VMware软件存求替代方案,尤其在Virtual Desktop Infrastructure(VDI)方面,寻求使用紫光集团旗下H3C的CAS云计算管理平台,又称CAS虚拟化解决方案/管理系统,H3C CAS是H3C公司面向数据中心自主研发的企业级虚拟化软件。CAS提供了强大的虚拟…

nz-select 数据回显失败,大模型救了我一命。

文章目录 前言问题现象问题解决经过数据类型的问题&#xff1f;求助大模型问题解决 小小的疑问 前言 最近老苦逼了。原本计划推进的《软件开发人员从0到1实现物联网项目》项目因为种种原因停滞了将近一个月&#xff0c;进展缓慢。其中一个原因就和本文有关。 继《时隔5年重拾…

MySQL迁移达梦,部分数据写入失败,VARCHAR字段长度不足

迁移时&#xff0c;字符长度选择“4”即可。如果是GBK可选择“2”。

八道指针笔试题

文章目录 笔试题1笔试题2笔试题3笔试题4笔试题5笔试题6笔试题7笔试题8 笔试题1 int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1); printf( "%d,%d", *(a 1), *(ptr - 1)); return 0; } //程序的结果是什么&#xff1f;首先定义了一个数组…