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

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

  • 23
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜只因C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值