STL使用方法(C++)

news2024/12/28 11:49:01

目录

1  前言

2  迭代器

2.1  访问第一个元素

2.2  访问最后一个元素的下一个元素

2.3  遍历方法

2.3.1  while

2.3.2  for(最常用)

2.4  适用性

3  基本数据结构

3.1  vector(动态数组)

3.1.1  insert(插入)

3.1.2  容器嵌套容器

3.1.3  自定义类型

3.1.4  常用函数

3.2  string(字符串)

3.2.1  插入+删除

3.2.2  查找

3.2.3  字符串和数字互化

3.2.4  替换

3.2.5  常用函数

3.3  queue(队列)

3.4  list(链表) 

3.5   priority_queue(优先队列)

3.5.1  常用函数

3.5.2  排序

3.6  stack(栈)

3.7  set(不能有重复元素的集合)multiset(可以有重复元素的集合)

3.7.1  插入+排序

3.7.2  常用函数

3.8  map(键不重复的键值对) multimap(键重复的键值对)

3.8.1   插入+排序

3.8.2  常用函数


1  前言

STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。

C++ 对模板(Template)支持得很好,STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。

STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)。

STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器。

容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据,从实现角度来看,STL容器是一种class template。

算法:各种常用的算法,如sort、find、copy、for_each。从实现的角度来看,STL算法是一种function tempalte.

迭代器:扮演了容器与算法之间的胶合剂,共有五种类型,从实现角度来看,迭代器是一种将operator* , operator-> , operator++,operator–等指针相关操作予以重载的class template. 所有STL容器都附带有自己专属的迭代器,只有容器的设计者才知道如何遍历自己的元素。原生指针(native pointer)也是一种迭代器。

仿函数:行为类似函数,可作为算法的某种策略。从实现角度来看,仿函数是一种重载了operator()的class 或者class template

适配器:一种用来修饰容器或者仿函数或迭代器接口的东西。

空间配置器:负责空间的配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放的class tempalte.

STL六大组件的交互关系,容器通过空间配置器取得数据存储空间,算法通过迭代器存储容器中的内容,仿函数可以协助算法完成不同的策略的变化,适配器可以修饰仿函数。

2  迭代器

2.1  访问第一个元素

这里以vector为例:

vector<int>::iterator it=v.begin();

2.2  访问最后一个元素的下一个元素

这里以vector为例:

vector<int>::iterator it=v.end();

2.3  遍历方法

2.3.1  while

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

2.3.2  for(最常用)

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

2.4  适用性

2.5  种类

 

3  基本数据结构

3.1  vector(动态数组)

3.1.1  insert(插入)

#include <bits/stdc++.h>
using namespace std;

int main()
{
	vector<int>v;
	v.push_back(1);
	v.push_back(2);
	v.push_back(3);
	v.push_back(4);
	v.insert(v.begin(),5,9);//insert(起始地址,插入个数,插入字符) 
	for(vector<int>::iterator it=v.begin();it!=v.end();it++)
	{
		cout<<*it<<endl;
	}
	return 0;
}

3.1.2  容器嵌套容器

#include <bits/stdc++.h>
using namespace std;

int main()
{
	vector<vector<int> >v;
	vector<int>v1;
	vector<int>v2;
	vector<int>v3;
	vector<int>v4;
	v1.push_back(1);
	v2.push_back(2);
	v3.push_back(3);
	v4.push_back(4);
	v.push_back(v1);
	v.push_back(v2);
	v.push_back(v3);
	v.push_back(v4);
	for(vector<vector<int> >::iterator it=v.begin();it!=v.end();it++)
	{
		for(vector<int>::iterator mit=(*it).begin();mit!=(*it).end();mit++)
		{
			cout<<*mit<<endl;
		}
	}
}

3.1.3  自定义类型

类模板:

#include <bits/stdc++.h>
using namespace std;

class person
{
public:
	person()
	{
		this->mname=name;
		this->mxuehao=xuehao;
	} 
public:
	string mname,name;
	int mxuehao,xuehao;
};

int main()
{
	person p1;
	cin>>p1.mname>>p1.mxuehao;
	cout<<"xingming:"<<p1.mname<<"xuehao:"<<p1.mxuehao<<endl;
	return 0;
}

vector自定义: 

#include <bits/stdc++.h>
using namespace std;

class person
{
public:
	person(string name,int age)
	{
		this->mname=name;
		this->mage=age;
	}
public:
	string mname;
	int mage;
};

int main()
{
	vector<person>v;
	person p1("aaa",10);
	person p2("bbb",20);
	person p3("ccc",30);
	v.push_back(p1);
	v.push_back(p2);
	v.push_back(p3);
	
	for(vector<person>::iterator it=v.begin();it!=v.end();it++)
	{
		cout<<"xingming:"<<it->mname<<"nianling:"<<it->mage<<endl;
	}
}

3.1.4  常用函数

3.2  string(字符串)

3.2.1  插入+删除

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	s="abcde";
	s.insert(0,"123");//insert(插入位置,插入字符) 
	cout<<s<<endl;
	s.erase(1,3); //erase(擦除位置,擦除长度) 
	cout<<s;
	return 0;
}

3.2.2  查找

#include <bits/stdc++.h>
using namespace std;
//注意两种查找区别 
int main()
{
	//字符串特殊查找 
	string s;
	s="abcdefgbc";
	cout<<s.find("bc")<<endl;//正序查找 
	cout<<s.rfind("bc")<<endl;//倒序查找
	//其他查找
	vector<int>v;
	v.push_back(123456789);
	if(find(v.begin(),v.end(),123456789)!=v.end())
	{
		cout<<"win";
	}
	return 0;
}

3.2.3  字符串和数字互化

详见例题超级质数:

超级质数(蓝桥杯C/C++算法赛)_菜只因C的博客-CSDN博客_超级质数https://blog.csdn.net/m0_71934846/article/details/128723978?spm=1001.2014.3001.5502

3.2.4  替换

#include <bits/stdc++.h>
using namespace std;

int main()
{
	string s;
	s="abcde";
	s.replace(1,3,"xyz");//replace(起始位置,替代长度,替代字符串) 
	cout<<s;
	return 0;
}

3.2.5  常用函数

3.3  queue(队列)

常用函数:

3.4  list(链表) 

常用函数:

3.5   priority_queue(优先队列)

3.5.1  常用函数

3.5.2  排序

注意:

排序的时候,默认是从小到大;从大到小排序要使第三个参数为greater()。
建堆的时候,默认是最大堆;最小堆要使第三个参数为greater()。

优先队列默认大根堆(大到小排序),如果想从小到大排序,那么

<int,vector<int>,greater<int> >//升序排列(小根堆)

3.6  stack(栈)

常用函数:

3.7  set(不能有重复元素的集合)multiset(可以有重复元素的集合)

3.7.1  插入+排序

注意:

排序的时候,默认是从小到大;从大到小排序要使第三个参数为greater()。
建堆的时候,默认是最大堆;最小堆要使第三个参数为greater()。

set默认从小到大排序,如果想从大到小排序,那么

<int,greater<int> >//降序排列

#include <bits/stdc++.h>
using namespace std;

int main()
{
	set<int>s;//不可重复,小-》大 
	s.insert(1);
	s.insert(1);
	s.insert(3);
	s.insert(2);
	for(set<int>::iterator it=s.begin();it!=s.end();it++)
	{
		cout<<*it<<endl;
	}
	cout<<endl;
	
	set<int,greater<int> >s1;//不可重复,大-》小 
	s1.insert(1);
	s1.insert(1);
	s1.insert(3);
	s1.insert(2);
	for(set<int>::iterator kit=s1.begin();kit!=s1.end();kit++)
	{
		cout<<*kit<<endl;
	}
	cout<<endl;
	
	multiset<int>m;//可重复 
	m.insert(1);
	m.insert(1);
	m.insert(3);
	m.insert(2);
	for(multiset<int>::iterator mit=m.begin();mit!=m.end();mit++)
	{
		cout<<*mit<<endl;
	}
	return 0;
}

3.7.2  常用函数

3.8  map(键不重复的键值对) multimap(键重复的键值对)

3.8.1   插入+排序

默认从大到小排序

#include <bits/stdc++.h>
using namespace std;

int main()
{
	map<int,int,less<int> >m;//小-》大 
	m.insert(pair<int,int>(4,10));
	m.insert(pair<int,int>(2,1));
	m.insert(pair<int,int>(3,5));
	m.insert(pair<int,int>(1,9));
	for(map<int,int>::iterator it=m.begin();it!=m.end();it++)
	{
		cout<<it->first<<' '<<it->second<<endl;
	}
	return 0;
}

3.8.2  常用函数

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

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

相关文章

最全面的SpringBoot教程(一)——SpringBoot概述

前言 本文为 【SpringBoot教程】SpringBoot概述 相关知识&#xff0c;下边将对SpringBoot简介&#xff08;包括&#xff1a;什么是SpringBoot&#xff0c;SpringBoot的特点&#xff0c;SpringBoot的功能&#xff0c;SpringBoot官网&#xff09;&#xff0c;SpringBoot快速入门&…

JAVA 同步锁

文章目录synchronizedsynchronized 作用当前对象synchronized 作用订单号条件synchronized 作用订单号字符串条件ReentrantLock 加 ConcurrentHashMap需求&#xff1a; 同一个订单才加同步锁&#xff0c;不同订单可并行synchronized synchronized是Java中的关键字&#xff0c;…

python--飞机大战(课程设计)

实现功能&#xff1a; 1&#xff1a;飞机的移动&#xff0c;发射子弹&#xff0c;手雷&#xff0c;生命值&#xff0c;生命条 2&#xff1a;敌飞机有3种形态&#xff08;小&#xff0c;中&#xff0c;大&#xff09;不同的飞机大小不一样&#xff0c;生命值不一样&#xff0c…

【halcon学习-读图像和遍历文件下图像】

halcon学习-读图像和遍历文件下图像1.读取单张图像2.读取多张选定图片3.读取文件目录下所有的图片1.读取单张图像 与很多图像处理读图算子一样&#xff0c;halcon里读取单张图片的操作很简单&#xff1a; read_image(test1, D:/myfile/作业/拉链检测/chain1.bmp)也可以使用Ct…

【数据结构与算法】LRU Cache

&#x1f320;作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《数据结构与算法要啸着学》 &#x1f387;座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;…

2023年房地产融资模式研究报告

第一章 概况 融资&#xff0c;英文为 Financing&#xff0c;指为支付超过现金或转账的购货款而采取的货币交易手段&#xff0c;或者为取得特定资产而筹集资金所采取的货币手段。融资通常指货币资金的特有者和需求者之间&#xff0c;直接或间接地进行资金融通的活动。 广义的融…

【操作系统】多线程与多进程通信之深入理解【2023.01.31】

基本概念 首先&#xff0c;假设这么一个场景&#xff0c;进程A有线程Thread_A1和线程Thread_A2&#xff0c;进程B有线程Thread_B1和Thread_B2。举个例子&#xff0c;系统中进程的内存是独立的&#xff0c;也就是一台内存为4G的计算机&#xff0c;除了系统占用的1G部分&#xf…

Oracle——分析函数

文章目录前言介绍demo案例测试测试前的准备rank()dense_rank()row_number()前言 分析函数在oracle中比较常见&#xff0c;但用的不多&#xff0c;今天有幸碰见&#xff0c;索性做一次使用的总结说明。 介绍 oracle中的分析函数&#xff0c;常见的有下面的三种&#xff1a; r…

四季度亏损扩大,Meta Reality Labs近4年财报营收汇总

2月2日青亭网报道&#xff0c;Meta今天发布了2022财年第四季度财报、全年财报。根据22年四季度财报信息显示&#xff0c;Reality Labs业务部门营收营收7.27亿美元&#xff0c;同比&#xff08;21年四季度8.77亿美元&#xff09;要下降17.1%&#xff1b;净亏损42.79亿美元&#…

R语言多元数据统计分析在生态环境中的应用

生态环境领域研究中常常面对众多的不同类型的数据或变量&#xff0c;当要同时分析多个因变量&#xff08;y&#xff09;时需要用到多元统计分析&#xff08;multivariate statistical analysis&#xff09;。多元统计分析内容丰富&#xff0c;应用广泛&#xff0c;是非常重要和…

关于java中的BigInteger

文章目录关于BigInteger类BigInteger的构造方法BigInteger方法使用示例算术运算API转换为基本数据类型的方法小结关于BigInteger类 BigInteger类是用于解决整型类型&#xff08;含基本数据类型及对应的包装类&#xff09;无法表示特别大的数组及运算问题。 即使是占用字节数最…

HTB_Weak RSA

文章目录信息收集RSA 算法题目解密信息收集 下载&#xff0c;解压 (密码都是hackthebox) enc后缀的文件是一种加密文件&#xff0c;打开为乱码&#xff0c;key.pub内容如下&#xff0c;是 RSA 加密算法的公钥 -----BEGIN PUBLIC KEY----- MIIBHzANBgkqhkiG9w0BAQEFAAOCAQwAMI…

CISP信息安全认证考试都考什么?

CISP考试是目前热门的信息安全认证考试&#xff0c;很多刚刚开始了解CISP的朋友&#xff0c;比较关心关于CISP考试内容的相关问题&#xff0c;今天就由中培小编带大家一起去看看CISP认证考试究竟都考哪些内容&#xff1f;首先来看一下试卷结构考试时间&#xff1a;120分钟考试题…

CSS图标与链接

目录 如何添加图标 Font Awesome 图标 实例 Bootstrap 图标 实例 Google 图标 实例 为图标添加样式或颜色 设置链接样式 实例 实例 文本装饰 实例 背景色 实例 链接按钮 实例 更多实例 如何添加图标 向 HTML 页面添加图标的最简单方法是使用图标库&#xff0…

【Less】全局样式重复注入问题

// package.json {"less": "^4.1.3","vite": "^3.1.0", }参考&#xff1a; [less/sass]如何避免因公共模块导致生成重复css代码解决 Vue CSS 样式重复载入&#xff0c;为 Vue 添加全局 less 或 sass 基础样式库【不是本篇解决方法&am…

vue3学习笔记之router(router4 + ts)

文章目录Vue Router1. 基本使用router-view2. 路由跳转2.1 router-link2.2 编程式导航2.3 replace3. 路由传参4. 嵌套路由5. 命令视图6. 重定向和别名6.1 重定向6.2 别名7. 路由守卫7.1 全局前置守卫7.2 全局后置守卫案例&#xff1a;加载滚动条8. 路由元信息9. 路由过渡动效10…

瞧不上alert 老古董?使用alert实现一个精美的弹窗

曾几何时alert陪伴了我很多歌日日夜夜&#xff0c;但现在人们越来越追求高端的技术&#xff0c;其实慢慢的我也都快淡忘了前端的世界里还有alert这么一个伟大的成员。 目录 一、为什么抛弃了alert? 1. 不同浏览器的表现 2. 第三方组件的使用 3. 代码意识的控制 二、用al…

2023年浏览器哪个好用速度快,看这一篇就够了

在网络覆盖的社会&#xff0c;不管走到哪里&#xff0c;都能上网浏览新闻、看热点资讯。浏览器是用户上网浏览的必要软件之一&#xff0c;它决定这用户浏览网页的速度和习惯。那么&#xff0c;2023年什么浏览器好用稳定速度快&#xff1f;目前优秀的浏览器有很多&#xff0c;但…

HDFS常用命令汇总

HDFS常用命令汇总一、前言信息二、帮助信息查看1、查看帮助信息2、帮助文档&#xff08;附带命令的详细说明&#xff09;三、常用命令1、创建目录2、查看目录下的内容3、上传文件4、上传并删除源文件5、查看文件内容6、查看文件开头内容7、查看文件末尾内容8、下载文件9、合并下…

ceph中报错“ clock skew detected on mon.ceph2, mon.ceph3”

自己搭建的ceph集群&#xff0c;显示时间不同步:clock skew detected on mon.ceph2, mon.ceph3但是查看chrony进程已经启动&#xff0c;ceph配置文件中,如下参数也已经配置&#xff0c;查看chrony.conf配置文件发现&#xff0c;同步源没有修改过&#xff0c;默认的于是修改ceph…