STL容器及其简单应用(stack、priority_queue、vector、deuqe、list、map/multimap、set/multiset)

目录

  • 前言
  • 【1】stack操作以及应用
    • stack的几个核心接口
    • 利用stack完成进制转换
  • 【2】priority_queue操作以及应用
    • priority_queue的几个核心接口
    • 利用priority_queue完成合并果子问题
  • 【3】vector操作以及应用
    • vector的几个核心接口
    • 利用vector完成随机排序
  • 【4】deuqe(双向队列)操作以及应用
    • deuqe的特点以及核心接口
    • 利用deuqe处理数据
  • 【5】list(双向链表)操作以及应用
    • list的特点
    • 双向链表实现数据的输入与求和
  • 【6】map/multimap操作以及应用
    • map/multimap的几个特点以及功能接口
    • map/multimap应用:优惠购物
  • 【7】set/multiset(集合/多重集合)操作以及应用
    • set/multiset的几个特点
    • 利用set完成随机数的产生以及排序
  • 总结


前言

前几天回老家没事儿在新华书店乘凉,无意翻到《c++信息学奥林匹克竞赛入门与提高》,拍了几张照片,顺便学点c++的知识。
现整理如下:
关于STL的知识可以先看看百度百科:STL(模板库)_百度百科


【1】stack操作以及应用

stack的几个核心接口

向栈中压入一个元素(push)、
取栈顶元素的值(top)、
弹出栈顶元素(pop)、
清空栈(empty)、
判断栈是否为空(isEmpty)

利用stack完成进制转换

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
using namespace std;//stack应用
//输入:十进制数n,转换成r进制数输出(2<=r<=16)
const string t = "0123456789ABCDEF";
int main()
{stack<int>s;int n, r, x;cin >> n >> r;while (n != 0){x = n % r;//求余数s.push(x);//将余数压入栈顶n = n / r;//缩小r倍}while (!s.empty()){cout << t[s.top()];	//转换成r进制数位s.pop();	//弹出栈顶元素,即移除元素}
}

结果:
在这里插入图片描述

【2】priority_queue操作以及应用

priority_queue的几个核心接口

push()——根据元素的优先级将元素置入优先队列(默认降序排列,大值优先)
top()——返回优先队列头部最大的元素的引用(不移除
pop()——从优先队列中移除最大元素
empty()——优先队列是否为空

priority_queue 的模板声明带有三个参数:
priority_queue<Type, Container, Functional>
其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,
优先队列就是大顶堆,队头元素最大。

利用priority_queue完成合并果子问题

问题描述以及分析:
在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆。多多决定把
所有的果子合成一堆。每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重力之和。
算法分析:
如有3种果子,数目依次为1,9,2。可以先将1,2堆合并,新堆数目为3,耗费体力为3。接着﹐将新堆
与数量为9的堆合并,又得到新的堆,数目为12,耗费体力为12。
所以多多总共耗费体力=3+12=15。可以证明15为最小的体力耗费值。
类似于堆操作(完全二叉树),优先级高的优先处理

代码实现:

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
using namespace std;
//最小值优先(升序处理)使用动态数组vector递增参数排序,相当于最小值优先
priority_queue<int, vector<int>, greater<int> > q;
//从小到大的优先级队列,可将greater改为less,即为从大到小,
int main()
{int i, n, ans = 0, t1 = 0, t2 = 0, t3 = 0, x;cin >> n;for (i=0;i<n;i++){cin >> x;	q.push(x);	//进队,把一个元素压入队尾}//所有元素压入队列中之后自动排序for (i = n;i > 1;i--)	//合并次数共计n-1次{t1 = q.top();		//取最小的元素q.pop();			//此元素出队列t2 = q.top();		//取第二小的元素q.pop();			//此元素出队列t3 = t1 + t2;		//合并果子数(合并较小的2个)ans +=t3;			//求果子数目之和q.push(t3);			//入队列//每一次循环,都会自动排序}cout << ans << endl;return 0;
}

结果:
在这里插入图片描述

【3】vector操作以及应用

vector的几个核心接口

常用操作效果
vectorc产生一个空的vetcor
c.size()返回元素个数
front()返回第一个元素的引用,不检查元素是否存在
back()返回最后一个元素的引用,不检查元素是否存在
begin()返回一个迭代器,指向第一个元素
end()返回一个迭代器,指向最后一个元素之后
c.insert(pos,e)在pos位置插入元素e的副本,并返回新元素的位置
c.push_back(e)在尾部添加一个元素e的副本
c.pop_back(e)移除最后一个元素但不返回最后一个元素
c.erase(pos)删除pos位置的元素,返回下一个元素的位置
c.clear()移除所有元素,清空容器

利用vector完成随机排序

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
#include <time.h>
using namespace std;
void Swap(int& a, int& b)
{int c = a;a = b;b = c;
}
void random_arrange(int a[], int len)
{int i;srand(time(NULL));for (i = 0; i < len; i++){Swap(a[i], a[rand() % (i + 1)]);}
}void print(int a[], int len)
{for (int i = 0; i < len; i++)cout << a[i] << "  ";cout << endl;
}int main(void)
{int a[] = { 1,2,3,4,5,6,7,8,9 };int len = sizeof(a) / sizeof(int);int i = 0;cout << "before arrange" << endl;print(a, len);//random_arrange(a, len);vector<int> se;			//这里的vector要是换成set会报错while (se.size() < len)se.push_back(a[i++]);random_shuffle(se.begin(), se.end());cout << "after arrange" << endl;for (i = 0; i < len; i++)cout << se[i] << "  ";cout << endl;return 0;
}

效果:
在这里插入图片描述

【4】deuqe(双向队列)操作以及应用

deque(双向队列)和vector非常相似,操作接口功能模块基本一致。它采用动态数组来管理元素,提供随机存取,可以在头尾两段快速插入和删除元素。

deuqe的特点以及核心接口

deque支持随机存取,可以使用迭代器或[ ]符号
deque支持在头部和尾部存储数据

操作效果
c,push_back(e)在尾部添加一个元素e的副本
c.push_front(e)在头部添加一个元素e的副本
c.pop_back()移除最后一个元素但不返回最后一个元素
c.pop_front()移除第一个元素但不返回第一个元素

利用deuqe处理数据

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
#include <time.h>using namespace std;int main()
{//deque(int nSize,const T& t):创建一个deque,元素个数为nSize,且值均为tdeque< int>d(10, 1);deque< int>::iterator it;int x, y;cin >> x >> y;d.push_front(y);d.push_back(x);cout << "d[0]=" << d[0] << endl;cout << "d[11]=" << d[11] << endl;cout << "d.front()=" << d.front() << endl;cout << "d.back()=" << d.back() << endl;for (it = d.begin();it != d.end();it++){cout << *it << " ";}cout << endl;return 0;
}

在这里插入图片描述

【5】list(双向链表)操作以及应用

list的特点

双向链表将元素按顺序存储在链表中。与动态数组vector相比,它允许快速地插入与删除,但是随机访问却比较慢。
特点:

使用双向链表管理元素,数据元素可以使任意类型T
list只能通过迭代器遍历数据(不支持随机存取,不能使用[ ])
在任何位置上执行元素的插入和移除都非常快

双向链表实现数据的输入与求和

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <string> 
#include <cstring> 
#include <list> 
#include<numeric>using namespace std;
list<int>list1;
int main()
{list<int>::iterator iter;//从双向链表list1前面向容器中添加数据list1.push_front(5);list1.push_front(8);//从双向链表list1后面向容器中添加数据list1.push_back(7);list1.push_back(9);//从前向后显示list1中的数据cout << "list1 data" << endl;for (iter = list1.begin();iter != list1.end();iter++){cout << *iter << " ";}cout << endl;//求和int result = accumulate(list1.begin(),list1.end(),0);cout << "Sum" << result << endl;return 0;
}

在这里插入图片描述

【6】map/multimap操作以及应用

map是STL关联式容器,它提供映射关系(第一个关键字,第二个关键值)的数据处理能力,通常用它来快速处理映射相关的数据集,map数据结构内部是一棵红黑树(平衡二叉树),它具有对数据自动排序的功能,我们可以快速高效处理容器中的数据,时间复杂度为logN。对于访问的迭代器来说,仅能修改关键值,不能修改key。

map/multimap的几个特点以及功能接口

元素包含两部分(key,value),key和value可以是任意类型
根据元素的key自动对元素排序,因此根据元素的key可以进行很快定位
不能直接改变元素的key,可以通过[ ]直接存取元素值
map中不允许key相同的元素,multimap允许key相同的元素

操作效果
map.c产生空的map
c.size()返回元素个数
count(key)返回键值==key的元素个数
find(key)返回键值==key 的第一个元素,找不到的话返回end
lower_bound(key)返回键值>=key的第一个元素
upper_bound(key)返回键值>key的第一个元素
equal_range(key)返回键值==key的元素区间
c.insert(pos,e)在pos位置为起点插入e的副本,并返回新元素的位置
c.erase(val)移除所有值为val的元素,返回移除元素个数

map/multimap应用:优惠购物

问题描述:
某购物网站平台进行优惠活动,每件商品当天第一个订单可以打75折。这天网站先后依次接受到了(N<100 000)个订单,订单的数据形式是:商品名价格(单价*数量),商品名是长度不超过20请按商品名字典序输出当天的每种商品名和其售出的总价。

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
#include <iomanip> //要用到格式控制符
using namespace std;
//声明映射变量m,由m[string]映射double类型的数值
map<string, double>m;
int main()
{string name;double val;int n;cin >> n;for (int i = 1;i <= n;i++){cin >> name >> val;//输入订单-商品名和价格if (m.count(name) == 0)	//如果是第一次出现m[name] = val * 0.75;		//打折,m[name]映射了商品价格的数值elsem[name] = val;	//不打折}//构建了map类型迭代器指针map<string, double>::iterator it;cout << "映射结果(统计)" << endl;for (it = m.begin();it != m.end();it++){//输出商品名和价格							2位浮点数cout << it->first << " " << fixed << setprecision(2) << it->second << endl;}return 0;
}

在这里插入图片描述

【7】set/multiset(集合/多重集合)操作以及应用

set(集合)是将容器内所有元素都能更具其键值自动排序,set元素的键值就是实值。set不允许两个元素有相同的键值,multiset可以有相同的键值。

set/multiset的几个特点

set使用平衡二叉树管理元素(红黑树)
set的每个元素值必须唯一,系统会自动将数据排序。他支持插入、删除、查找等操作,所有的操作都在logN时间之内完成,效率比较高。
set和multiset的区别是:set插入的元素不能相同,而multiset可以相同
操作指令同map

利用set完成随机数的产生以及排序

#include <iostream> 
#include <cstdio> 
#include <fstream> 
#include <algorithm> 
#include <cmath> 
#include <deque> 
#include <vector> 
#include <queue> 
#include <string> 
#include <cstring> 
#include <map> 
#include <stack> 
#include <set> 
using namespace std;
//生成n个指定范围a~b中的不重复随机数(a<=b<=10000)
int main()
{set<int>s;int n, a, b,x;cin >> n >> a >>b;while (s.size() < n){x = rand() % (b - a + 2) + a;	//产生的随机数s.insert(x);	//在集合中插入元素(自动去重处理)	}cout << "输出(默认升序+去重):" << endl;set<int>::iterator it1;	//正向迭代器for (it1 = s.begin();it1 != s.end();it1++)cout << *it1 << " ";cout << endl;return 0;
}

在这里插入图片描述


总结

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

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

相关文章

Android SAX API: XmlResourceParser及其扩展应用

XmlResourceParser继承了2个接口&#xff1a;AttributeSet和XmlPullParser。其中XmlPullParser定义了Android SAX框架。跟Java 的SAX API相比&#xff0c;XmlPullParser令人难以置信地简单。 一、使用XmlResourceParser读取资源束中的xml 资源束是应用程序编译后的应用程序包…

linux fdisk 磁盘空间使用率,linux查看磁盘剩余空间以及cpu使用情况

1、查看CPU个数cat /proc/cpuinfo | grep "physical id" | uniqtop可以实时的查看cpu的使用情况2、查看CPU核数cat /proc/cpuinfo | grep "cpu cores" | uniq3、查看CPU型号cat /proc/cpuinfo | grep model name |uniq4、查看内存cat /proc/meminfo | grep…

c语言 函数的参数传递示例_restder()函数,带有C ++中的示例

c语言 函数的参数传递示例C restder()函数 (C remainder() function) remainder() function is a library function of cmath header, it is used to calculate the remainder (IEC 60559), it accepts two parameters (numerator and denominator) and returns the remainder…

jquery validation-jquery的验证框架 详解(1)

jquery validation验证框架是一款非常优秀的客户端数据验证框架。我们在日常的项目中都会应用得到。今天开始我们会分两到三个个阶段 详细的了解这款插件 至于这款插件是多么的优秀&#xff0c;怎么个描述法 我这里就不详细述说。大家可以在接下来的时间里接触并且感觉它的强大…

已知一个掺杂了多个数字字符的中文名拼音,去掉所有数字字符之后,形式为“名”+空格+“姓”;并且名和姓的首字母大写,其他小写,要求输出姓名全拼,且全为小写。(后附详细样例说明)

已知一个掺杂了多个数字字符的中文名拼音&#xff0c;去掉所有数字字符之后&#xff0c;形式为“名”空格“姓”&#xff1b;并且名和姓的首字母大写&#xff0c;其他小写&#xff0c;要求输出姓名全拼&#xff0c;且全为小写。&#xff08;后附详细样例说明&#xff09; 【输入…

【视觉项目】【day2】8.21号实验记录(手机固定高度15cm拍摄+直方图均衡化+模板匹配,模板12个,测试28个,效果十分差)

目录均衡化代码模板图片按照大小排序总代码测试效果新思路由于模板匹配是像素之间的比对&#xff0c;所以不同光照下的像素灰度值也会不同 所以在比对之前&#xff0c;我们需要对测试图和模板图进行直方图均衡化&#xff0c;这一步可以先实现。 今天将采用批量处理的方式&#…

c语言 函数的参数传递示例_isgreater()函数以及C ++中的示例

c语言 函数的参数传递示例C isgreater()函数 (C isgreater() function) isgreater() function is a library function of cmath header, it is used to check whether the given first value is greater than the second value. It accepts two values (float, double or long…

在一个风景秀丽的小镇,一天早上,有N名晨跑爱好者(编号1~N)沿着优雅的江边景观道朝同一方向进行晨跑

【问题描述】 在一个风景秀丽的小镇&#xff0c;一天早上&#xff0c;有N名晨跑爱好者(编号1~N)沿着优雅的江边景观道朝同一方向进行晨跑&#xff0c;第i名跑者从位置si处起跑&#xff0c;且其速度为Vi。换句话说&#xff0c;对所有的实数t≥0&#xff0c;在时刻t时第i名跑者的…

linux内核测试,Linux内核测试的生命周期

内核持续集成(CKI)项目旨在防止错误进入 Linux 内核。在 Linux 内核的持续集成测试 一文中&#xff0c;我介绍了 内核持续集成Continuous Kernel Integration(CKI)项目及其使命&#xff1a;改变内核开发人员和维护人员的工作方式。本文深入探讨了该项目的某些技术方面&#xff…

Linux下动态库使用小结

1. 静态库和动态库的基本概念 静态库&#xff0c;是在可执行程序连接时就已经加入到执行码中&#xff0c;在物理上成为执行程序的一部分&#xff1b;使用静态库编译的程序运行时无需该库文件支持&#xff0c;哪里都可以用&#xff0c;但是生成的可执行文件较大。动态库&#xf…

【视觉项目】【day3】8.22号实验记录(利用canny检测之后的来进行模板匹配)

【day3】8.22号实验记录&#xff08;几乎没干正事的一天&#xff0c;利用canny检测之后的来进行模板匹配&#xff09; 今天没搞代码&#xff0c;主要是问研究生学长工业摄像头的接法的&#xff0c;学长也不知道&#xff0c;明天问问老师。。。 晚上搞了一下canny之后的模板匹配…

scala字符替换_如何替换Scala中的“坏”字符?

scala字符替换In Scala, programming language, all sorts of special characters are valid. The character set library is quite good and supports almost all characters in Scala programming. 在编程语言Scala中&#xff0c;各种特殊字符均有效。 字符集库非常好&#x…

linux dd 大文件下载,Linux dd+grep 大文件二分查找

Linux dd 命令用于读取、转换并输出数据。dd 可从标准输入或文件中读取数据&#xff0c;根据指定的格式来转换数据&#xff0c;再输出到文件、设备或标准输出。参数说明(dd --help)Usage: dd [OPERAND]...or: dd OPTIONCopy a file, converting and formatting according to th…

【视觉项目】【day1】8.20号实验记录(初步使用模板匹配)

目录【day1】8.20号实验记录&#xff08;初步使用模板匹配&#xff09;模板匹配单张图的代码利用多个模板去匹配多张图的代码写代码过程中遇到的问题【day1】8.20号实验记录&#xff08;初步使用模板匹配&#xff09; 模板匹配 利用模板匹配可以框定出瓶子&#xff0c;但是却…

第四章 纤维结构对染色性能的影响单元测验

1,利用红外光谱技术可以测定纤维的() 化学结构。 2,纤维完整的结构包括() 化学结构。 表面形态结构。 内部超分子结构。 3,纤维化学结构由于影响了纤维(),进而影响其染色性能 吸湿溶胀性能。 在染液中电离性能。 在染浴中的带电性。 与染液中各组分之间的作用力。 …

创建存储过程时出现的This function has none of DETERMINISTIC, NO SQL解决办法

This function has none of DETERMINISTIC, NO SQL解决办法创建存储过程时 出错信息&#xff1a; ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the …

如何让没有安装网页中所需字体的用户也能得到一致的浏览效果【转】

今天给大家谈一个关于字体的话题,我们在做项目的过程中会遇到一些在psd中的字体在自己的电脑中没有安装&#xff0c;或者是一些特殊的文字&#xff0c;通常的做法是把它切成图片&#xff0c;但是如果这个站是多个语言的&#xff0c;那我们是不是把每个语言的都切一张图片呢&…

【视觉项目】【day4】8.24号实验记录(消除瓶子内部“边缘”)

思路分析以及代码 思路1&#xff1a;使用findContours函数&#xff0c;设置轮廓为最外部RETR_EXTERNAL&#xff0c;结果发现结果仍然是所有轮廓。 思路2&#xff1a;先二值化&#xff0c;然后进行闭操作&#xff0c;然后canny&#xff0c;得到的轮廓确实比之前少很多&#xff…

operator.ne_Python operator.ne()函数与示例

operator.neoperator.ne()函数 (operator.ne() Function) operator.ne() function is a library function of operator module, it is used to perform "not equal to operation" on two values and returns True if the first value is not equal to the second val…

国产操作系统和linux 之间的关系,为何国产系统大多基于开源Linux?操作系统从0做起到底有多难?...

今年貌似是国产操作系统的“爆发”之年&#xff0c;除了老牌的银河麒麟、中标麒麟、深度之外&#xff0c;中兴近日发布了自己的“新支点”&#xff0c;华为也公开了自研的操作系统“鸿蒙”。纵观这些国产操作系统&#xff0c;大多基于开源的Linux。那么为什么我们不可以从0开始…