c++STL容器之序列式容器

news2024/11/17 5:24:17

目录

vector容器

vector对象的默认构造

vector的初始化

vector的遍历

vector的增删改查

vector末尾的添加移除操作  

vector的数据存取

deque容器

deque对象的默认构造

deque末尾的添加移除操作

deque的数据存取

 stack容器

stack对象的默认构造

stack的push()与pop()方法

stack对象的拷贝构造与赋值

stack的遍历

queue容器

queue容器的初始化及遍历

list容器

list头尾的添加移除操作

list的数据存取

list的插入

list的删除


序列式容器(Sequence containers)在c++中主要有三种:vector、deque、list 。

vector容器

  • vector是将元素置于一个动态数组中加以管理的容器。
  • vector可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法)。

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

vector对象的默认构造

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

vector<T> vecT;

vector<int> vecInt;         //一个存放int的vector容器。

vector<float> vecFloat;      //一个存放float的vector容器。

vector<string> vecString;    //一个存放string的vector容器。

...     //尖括号内还可以设置指针类型或自定义类型。

Class CA{};

vector<CA*> vecpCA;    //用于存放CA对象的指针的vector容器。

vector<CA> vecCA;      //用于存放CA对象的vector容器。由于容器元素的存放是按值复制的方式进行的,所以此时CA必须提供CA的拷贝构造函数,以保证CA对象间拷贝正常。

vector的初始化

//vector的初始化
void main32()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);
	v1.push_back(7);

	vector<int> v2 = v1;
	vector<int> v3(v1.begin(), v1.begin() + 2);
}

vector的遍历

主要有两种方式,数组方式遍历和迭代器方式的遍历。

void printV(vector<int>& v)
{
	for (int i = 0; i < v.size(); i++)
	{
		cout << v[i] << " ";
	}
	cout << endl;
}
void main35()
{
	vector<int> v1(10);
	for (int i = 0; i < 10; i++)
	{
		v1[i] = i + 1;
	}

	for (vector<int>::iterator it = v1.begin(); it != v1.end(); it++)
	{
		cout << *it << " ";
	}

	cout << endl;
	//逆向遍历
	for (vector<int>::reverse_iterator rit = v1.rbegin();rit != v1.rend(); rit++)
	{
		cout << *rit << " ";
	}
}

vector的增删改查

vector末尾的添加移除操作  

vector<int> vecInt;

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

vecInt.push_back(3);  

vecInt.push_back(5);  

vecInt.push_back(7);

vecInt.push_back(9);

vecInt.pop_back();    //移除容器中最后一个元素

vecInt.pop_back();

//{5 ,7 ,9}  

vector的数据存取

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

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

vector<int> vecInt;    //假设包含1 ,3 ,5 ,7 ,9

vecInt.at(2) == vecInt[2] ; //5

vecInt.at(2) = 8;  或  vecInt[2] = 8;

vecInt 就包含 1, 3, 8, 7, 9值

int iF = vector.front(); //iF==1

int iB = vector.back(); //iB==9

vector.front() = 11; //vecInt包含{11,3,8,7,9}

vector.back() = 19; //vecInt包含{11,3,8,7,19}

//vector 删除
void main36()
{
	vector<int> v1(10);
	for (int i = 0; i < 10; i++)
	{
		v1[i] = i + 1;
	}

	//区间删除
	v1.erase(v1.begin(), v1.begin() + 3);
	printV(v1);

	//根据元素的位置删除
	v1.erase(v1.begin());
	printV(v1);

	//根据元素的值
	v1[1] = 2;
	v1[3] = 2;
	printV(v1);

	for (vector<int>::iterator it = v1.begin(); it != v1.end();)
	{
		if (*it == 2)
		{
			it = v1.erase(it);//当删除迭代器所指向的元素的时候,erease删除函数会让it自动下移动
		}
		else
		{
			it++;
		}
	}
	printV(v1);

	v1.insert(v1.begin(), 100);
	v1.insert(v1.end(), 200);
	printV(v1);
}

deque容器

  • deque是“double-ended queue”的缩写,和vector一样都是STL的容器,deque是双端数组,而vector是单端的。
  • deque在接口上和vector非常相似,在许多操作的地方可以直接替换。
  • deque可以随机存取元素(支持索引值直接存取, 用[]操作符或at()方法,这个等下会详讲)。
  • deque头部和尾部添加或移除元素都非常快速。但是在中部安插元素或移除元素比较费时。

deque对象的默认构造

deque采用模板类实现,deque对象的默认构造形式:deque<T> deqT;  

deque <int> deqInt;            //一个存放int的deque容器。

deque <float> deq Float;     //一个存放float的deque容器。

deque <string> deq String;     //一个存放string的deque容器。

 //尖括号内还可以设置指针类型或自定义类型。

deque末尾的添加移除操作

  • deque.push_back(elem); //在容器尾部添加一个数据
  • deque.push_front(elem); //在容器头部插入一个数据
  • deque.pop_back();     //删除容器最后一个数据
  • deque.pop_front(); //删除容器第一个数

deque的数据存取

  • deque.at(idx);  //返回索引idx所指的数据,如果idx越界,抛出out_of_range。
  • deque[idx];  //返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
  • deque.front();   //返回第一个数据。
  • deque.back();  //返回最后一个数据
void main41()
{
	deque<int> d1;
	d1.push_back(1);
	d1.push_back(3);
	d1.push_back(5);

	d1.push_front(-11);
	d1.push_front(-33);
	d1.push_front(-55);
	printD(d1);

	cout << endl;
	cout << "头部元素:" << d1.front() << endl;
	cout << "尾部元素:" << d1.back() << endl;
	
	d1.pop_front();
	d1.pop_back();
	printD(d1);
	cout << endl;

	//查找-33在数组下标的值
	deque<int>::iterator it = find(d1.begin(), d1.end(), -33);
	if (it != d1.end())
	{
		cout << "-33数组下标是" << distance(d1.begin(), it) << endl;
	}
	else
	{
		cout << "没有找到值为-33的元素" << endl;
	}

}

 stack容器

  • stack是堆栈容器,是一种“先进后出”的容器。
  • stack是简单地装饰deque容器而成为另外的一种容器。

stack对象的默认构造

stack采用模板类实现, stack对象的默认构造形式: stack <T> stkT;  

stack <int> stkInt;            //一个存放int的stack容器。

stack <float> stkFloat;     //一个存放float的stack容器。

stack <string> stkString;     //一个存放string的stack容器。

//尖括号内还可以设置指针类型或自定义类型。

//栈模型
//栈的算法和栈容器数据类型的分离
void main51()
{
	stack<int> s;

	//入栈
	for (int i = 0; i < 10; i++)
	{
		s.push(i + 1);
	}
	cout << "栈的大小" << s.size() << endl;

	//出栈
	while (!s.empty())
	{
		//获取栈顶元素
		int tmp = s.top();
		cout << tmp << " ";
		s.pop();//弹出栈顶元素
	}

}

stack的push()与pop()方法

stack.push(elem);   //往栈头添加元素

stack.pop();   //从栈头移除第一个元素

stack对象的拷贝构造与赋值

stack(const stack &stk);      //拷贝构造函数

stack& operator=(const stack &stk); //重载等号操作符

stack的遍历

void main52()
{
	Teacher5 t1, t2, t3;
	t1.age = 31;
	t2.age = 32;
	t3.age = 33;

	stack<Teacher5> s;
	s.push(t1);
	s.push(t2);
	s.push(t3);

	while (!s.empty())
	{
		Teacher5 tmp = s.top();
		tmp.prinT();
		s.pop();
	}
}

queue容器

  • queue是队列容器,是一种“先进先出”的容器。
  • queue是简单地装饰deque容器而成为另外的一种容器。

queue采用模板类实现,queue对象的默认构造形式:queue<T> queT;  如:

queue<int> queInt;            //一个存放int的queue容器。

queue<float> queFloat;     //一个存放float的queue容器。

queue<string> queString;     //一个存放string的queue容器。

//尖括号内还可以设置指针类型或自定义类型。

queue容器的初始化及遍历

//队列中基本数据类型
void main61()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);

	cout << "队头元素" << q.front() << endl;
	cout << "队列的大小" << q.size() << endl;
	
	while (!q.empty())
	{
		int tmp = q.front();
		cout << tmp << " ";
		q.pop();
	}
}

list容器

  • list是一个双向链表容器,可高效地进行插入删除元素。
  • list不可以随机存取元素,所以不支持at.(pos)函数与[]操作符。It++(ok) it+5(err)

list采用采用模板类实现,对象的默认构造形式:list<T> lstT;  如:

list<int> lstInt;            //定义一个存放int的list容器。

list<float> lstFloat;     //定义一个存放float的list容器。

list<string> lstString;     //定义一个存放string的list容器。

//尖括号内还可以设置指针类型或自定义类型。

list头尾的添加移除操作

  • list.push_back(elem);    //在容器尾部加入一个元素
  • list.pop_back();              //删除容器中最后一个元素
  • list.push_front(elem);     //在容器开头插入一个元素
  • list.pop_front();              //从容器开头移除第一个元素

list的数据存取

  • list.front();   //返回第一个元素。
  • list.back();  //返回最后一个元素。
void main71()
{
	list<int> l;
	cout << "list的大小:" << l.size() << endl;
	for (int i = 0; i < 10; i++)
	{
		l.push_back(i);//尾部插入元素 尾插法
	}
	cout << "list的大小:" << l.size() << endl;

	list<int>::iterator it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	//lsit不能随机访问
	it = l.begin();
	it++;
	it++;
	it++;
	//it += 5; 不支持随机的访问容器
	l.insert(it, 100);//100插入在什么位置
	
	for (list<int>::iterator it = l.begin(); it != l.end(); it++)
	{
		cout << *it << " ";
	}

	//结论1:链表的结点的index序号是从0号位置开始
	//结论2:在3号位置插入元素,是让原来的3号位置变成4号位置 原来的4号位置变成5号位置
	
}

list的插入

  • list.insert(pos,elem);   //在pos位置插入一个elem元素的拷贝,返回新数据的位置。
  • list.insert(pos,n,elem);   //在pos位置插入n个elem数据,无返回值。
  • list.insert(pos,beg,end);   //在pos位置插入[beg,end)区间的数据,无返回值。

list的删除

  • list.clear(); //移除容器的所有数据
  • list.erase(beg,end);  //删除[beg,end)区间的数据,返回下一个数据的位置。
  • list.erase(pos);    //删除pos位置的数据,返回下一个数据的位置。

lst.remove(elem);   //删除容器中所有与elem值匹配的元素

//list删除
void main72()
{
	list<int> l;
	cout << "list的大小:" << l.size() << endl;
	for (int i = 0; i < 10; i++)
	{
		l.push_back(i);//尾部插入元素 尾插法
	}
	cout << "list的大小:" << l.size() << endl;

	list<int>::iterator it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	list<int>::iterator it1 = l.begin();
	list<int>::iterator it2 = l.begin();
	it2++;
	it2++;
	it2++;


	l.erase(it1, it2);
	it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

	l.insert(l.begin(), 100);
	l.insert(l.begin(), 100);
	l.insert(l.begin(), 100);

	it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	l.erase(l.begin());

	it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
	l.remove(100);

	it = l.begin();

	while (it != l.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

 

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

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

相关文章

Midjourney科普介绍

Midjourney是啥&#xff1f; Midjourney是一个由Midjourney研究实验室开发的人工智能程序&#xff0c;可根据文本生成图像&#xff0c;于2022年7月12日进入公开测试阶段&#xff0c;使用者可通过Discord的机器人指令进行操作&#xff0c;可以创作出很多的图像作品。 以下这些…

ROS2中将octomap发布到Moveit中作为碰撞物体

1.安装准备 这里假设你已经装好了ROS2以及Moveit2&#xff08;都用二进制安装就行&#xff0c;不用从源码安转&#xff09;&#xff0c;没有安装好的&#xff0c;可以按照鱼香ROS的教程安装&#xff0c;两三行命令就搞定了。 我的ROS2版本为humble&#xff0c;请根据你使用的实…

银行数字化转型导师坚鹏:银行同业核心产品与营销策略解读

数字化背景下银行同业核心产品与营销策略解读课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚银行同业核心产品发展现状&#xff1f; 不清楚如何银行同业产品营销策略&#xff1f; 不知道如何更好地挖掘他行优质客户&#xff1f; 课…

国产化系统改造实践(未完)

一、项目背景 2020 年,红帽公司宣布,将在 2021 年 12 月 31 日和 2024 年 6 月 30 日分别终止对 CentOS 8 和 CentOS 7 的服务支持,把 CentOS 项目的工作和投资集中在CentOS Stream 上。 CentOS Linux 8已于2021年12月31日停止维护,CentOS Linux7也 将于2024年6月停服。s所…

技术创业者必读:从验证想法到技术产品商业化的全方位解析

导语 | 技术创业之路往往充满着挑战和不确定性&#xff0c;对于初入创业领域的人来说&#xff0c;如何验证自己的创业想法是否有空间、如何选择靠谱的投资人、如何将技术产品商业化等问题都需要认真思考和解决。在「TVP 技术夜未眠」第六期直播中&#xff0c;正马软件 CTO、腾讯…

【《C Primer Plus》读书笔记】第17章:高级数据表示

【《C Primer Plus》读书笔记】第17章&#xff1a;高级数据表示17.1 研究数据表示17.2 从数组到链表17.3 抽象数据类型&#xff08;ADT&#xff09;17.4 队列ADT17.5 用队列进行模拟17.6 链表和数组17.7 二叉查找树17.8 其他说明17.1 研究数据表示 在开始编写代码之前&#xf…

【2023】前端JWT详解

概述 回顾登录的流程&#xff1a; 接下来的问题是&#xff1a;这个出入证&#xff08;令牌&#xff09;里面到底存啥&#xff1f; 一种比较简单的办法就是直接存储用户信息的JSON串&#xff0c;这会造成下面的几个问题&#xff1a; 非浏览器环境&#xff0c;如何在令牌中记录…

C/C++每日一练(20230416)

目录 1. 求数列第n项值 ※ 2. 整数转换英文表示 &#x1f31f;&#x1f31f;&#x1f31f; 3. 数组中找出最大值及索引位置 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 求数…

微信小程序引入骨架屏

骨架屏的使用越来越广泛。在微信小程序中使用骨架屏如果自己实现&#xff0c;不同的页面对应不同的骨架屏&#xff0c;会有一定难度&#xff1b;不过&#xff0c;微信小程序已经提供生成骨架屏功能&#xff0c;使得我们在开发中非常方便&#xff0c;下面介绍如何生成 在生成骨架…

[Linux]管理用户和组

​⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Linux基础操作。本文主要是分享一些Linux系统常用操作&#xff0c;内容主要来源是学校作业&#xff0c;分享出来的…

JavaEE 协议 信息是如何在一个机器传到另一个机器的(理论)

抓住你了&#xff01; 文章目录JavaEE & 协议 & 信息是如何在一个机器传到另一个机器的1. 局域网2. 广域网3. IP与端口号&#xff08;初识&#xff09;4. 协议4.1 协议分类分层4.2 协议分层的好处4.3 真实的网络协议分层&#xff0c;TCP/IP五层网络模型4.3.1 应用层4.3…

Spark 3.0中 Spark SQL优化

在Spark3.x版本提供Adaptive Query Execution自适应查询技术&#xff0c;通过在”运行时”对查询执行计划进行优化&#xff0c;允许Planner在运行时执行可选计划&#xff0c;这些可选计划将会基于运行时数据统计进行动态优化&#xff0c;从而提高性能。 Adaptive Query Execut…

在DongshanPI-D1开箱使用分享与折腾记录实现MPU6050数据读取

前言 上一篇文章使用RT-Smart的IIC驱动OLED屏幕&#xff0c;进行基本的字符串显示,在使用过程中对RT-Smart有了一定熟悉&#xff0c;准备使用SPI驱动ST7789&#xff0c;但SPI接口没有引出&#xff0c;本次使用手上已有的传感器MPU6050进行使用。 过程 本次直接开始添加离线包…

NDK RTMP直播客户端二

在之前完成的实战项目【FFmpeg音视频播放器】属于拉流范畴&#xff0c;接下来将完成推流工作&#xff0c;通过RTMP实现推流&#xff0c;即直播客户端。简单的说&#xff0c;就是将手机采集的音频数据和视频数据&#xff0c;推到服务器端。 接下来的RTMP直播客户端系列&#xff…

在国内pmp证书有什么含金量?

关于PMP的含金量&#xff0c;很多回答的说法都差不多&#xff0c;但那也只是字面上的含金量&#xff0c;真正的含金量还是得自己考过了之后能够给自己带来的帮助才方可对PMP含金量下定义&#xff0c;但能一眼就能看到的含金量是在一些招聘信息上关于PMP证书的要求&#xff0c;下…

【Axure教程】日期时间下拉列表

在系统中&#xff0c;我们经常会用到日期时间选择器&#xff0c;它同时包含了日历日期的选择和时间的选择&#xff0c;一般是下拉列表的形式进行选择。 今天作者就教大家如何在Axure中用中继器制作真实日期时间效果的下拉列表选。 一、效果展示 1、点击控件&#xff0c;可以…

游戏开发学习路线图(2023最新版)建议收藏

游戏开发是一个高度技术化的领域&#xff0c;需要掌握编程语言和编程技能。你可以从学习基本的编程概念和语法开始&#xff0c;如C、C#、Python等常用的游戏编程语言。掌握编程的基础知识是游戏开发的基石。很多小伙伴不知道怎么学习游戏开发&#xff0c;那么今天&#xff0c;就…

c/c++:windows平台下依赖的动态库,c底层是汇编语言,程序断点调试,反汇编,vs快捷键

c/c&#xff1a;windows平台下依赖的动态库&#xff0c;c底层是汇编语言&#xff0c;程序断点调试&#xff0c;反汇编&#xff0c;vs快捷键 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;此时学会c的话&#xff0c; 我所知…

【多媒体】多媒体架构

多媒体架构 首先,多媒体架构层通常由三个主要层次组成: 应用层:负责媒体的展示、控制和交互等功能,如播放器、视频编辑器等。应用层一般是用户最直接接触到的界面。 中间件层:提供了各种媒体操作的基本服务,如编解码、音频合成、图像处理、网络传输、数据存储等。中间件…

【图像分割】Meta分割一切(SAM)模型环境配置和使用教程

注意&#xff1a;python>3.8, pytorch>1.7,torchvision>0.8 Feel free to ask any question. 遇到问题欢迎评论区讨论. 官方教程&#xff1a; https://github.com/facebookresearch/segment-anything 1 环境配置 1.1 安装主要库&#xff1a; &#xff08;1&…