STL使用方法(C++)

这篇具有很好参考价值的文章主要介绍了STL使用方法(C++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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  适用性

STL使用方法(C++)

2.5  种类

STL使用方法(C++)

 

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  常用函数

STL使用方法(C++)

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  常用函数

STL使用方法(C++)

3.3  queue(队列)

常用函数:

STL使用方法(C++)

3.4  list(链表) 

常用函数:

STL使用方法(C++)

3.5   priority_queue(优先队列)

3.5.1  常用函数

STL使用方法(C++)

3.5.2  排序

注意:

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

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

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

3.6  stack(栈)

常用函数:

STL使用方法(C++)

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  常用函数

STL使用方法(C++)

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  常用函数

STL使用方法(C++)文章来源地址https://www.toymoban.com/news/detail-411592.html

到了这里,关于STL使用方法(C++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python使用迭代生成器yield减少内存占用的方法

    在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中。 其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会用到本文所介绍的迭代生成器yield。 首先我们用一个例子来演示一下迭代

    2024年04月28日
    浏览(31)
  • 【C++庖丁解牛】STL之vector容器的介绍及使用 | vector迭代器的使用 | vector空间增长问题

    🍁你好,我是 RO-BERRY 📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 vector的文档介绍 vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存

    2024年03月14日
    浏览(79)
  • C++STL第五篇(链表List的使用方法)

    链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下

    2024年03月19日
    浏览(76)
  • C++迭代器(STL迭代器)iterator详解

    要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。 迭代器按照定义方式分

    2024年02月03日
    浏览(45)
  • 在python中实现使用迭代生成器yield减少内存占用的方法

    在python编码中for循环处理任务时,会将所有的待遍历参量加载到内存中。其实这本没有必要,因为这些参量很有可能是一次性使用的,甚至很多场景下这些参量是不需要同时存储在内存中的,这时候就会用到本文所介绍的迭代生成器yield。 首先我们用一个例子来演示一下迭代

    2024年02月11日
    浏览(38)
  • C++ [STL容器反向迭代器]

    本文已收录至《C++语言》专栏! 作者:ARMCSKGT 我们知道STL大部分容器都有迭代器,迭代器又分为正向迭代器和反向迭代器,对于正向迭代器以及实现前面我们已经了解了不少,而反向迭代器的设计思想是 适配器模式 ,本节我们介绍反向迭代器的实现! 适配器是把一个类的接

    2024年02月11日
    浏览(58)
  • 【c++手撕STL】之迭代器

    在C++ STL (Standard Template Library,标准模板库)中,迭代器是一个非常重要的组成部分。迭代器像是一个指针,负责在容器的元素之间移动,并且能够访问到容器的元素。 C++ STL 提供了几种类型的迭代器,每种迭代器都有它独特的功能和特性: 输入迭代器(Input Iterators) :只读不

    2024年02月12日
    浏览(39)
  • C++ stl迭代器的理解

    首先,stl采用了泛型编程,分成了容器和算法,容器和算法之间的桥梁是迭代器,迭代器的作用是可以让算法不区分容器来作用在数据上。 迭代器本质上是指针,原有类型(比如int,double等)的指针也可以是迭代器,那如何让代码区分开他们呢? 我们可以把自定义的迭代器包

    2024年02月15日
    浏览(51)
  • C++ STL学习之【反向迭代器】

    ✨个人主页: 北 海 🎉所属专栏: C++修行之路 🎊每篇一句: 图片来源 A year from now you may wish you had started today. 明年今日,你会希望此时此刻的自己已经开始行动了。 适配器模式是 STL 中的重要组成部分,在上一篇文章中我们学习了 容器适配器 的相关知识,即 stack 与 queu

    2023年04月25日
    浏览(48)
  • 【C++】STL反向迭代器模拟实现,迭代器适配器,迭代器类型简单介绍

    本篇主要讲反向迭代器的模拟实现。 能够加深各位对泛型的理解。 前面我那篇string介绍里面已经提到过反向迭代器是啥了,如果点进来的同学还不知道,可以看看:[string介绍](https://blog.csdn.net/m0_62782700/article/details/130796914? spm=1001.2014.3001.5501) 迭代器,可以在不暴露底层实现细

    2024年02月16日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包