【C++】标准模板库(下)


C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

在之前已经介绍关于vector,set,string,map的用法与函数,接下来将再讲剩下的几个类。

一、stack

栈是最基本的数据结构之一,特点是先进先出。

常用操作有:

stack<int> q;	//以int型为例
int x;
q.push(x);		//将x压入栈顶
q.top();		//返回栈顶的元素
q.pop();		//删除栈顶的元素
q.size();		//返回栈中元素的个数
q.empty();		//检查栈是否为空,若为空返回true,否则返回false

二、queue

不能用vector容器初始化queue,例如queue<vector<int> >是错误的。

常用操作:

push() 在队尾插入一个元素
pop() 删除队列第一个元素
size() 返回队列中元素个数
empty() 如果队列空则返回true
front() 返回队列中的第一个元素
back() 返回队列中最后一个元素

三、priority_queue

优先队列,底层由大小堆实现,可以用logn的时间维护数据的有序性,不允许随机访问,只能访问队首的元素,也只能对首部元素出队。

大顶堆

priority_queue<int> q;//储存int型数据 
priority_queue<double> q;//储存double型数据 
priority_queue<string> q;//储存string型数据 
priority_queue<结构体名> q;//储存结构体或者类 

小顶堆

priority_queue<int,vector<int>,greater<int>> q;//储存int型数据
priority_queue<double,vector<double>,greater<double>> q;//储存double型数据
priority_queue<string,vector<string>,greater<string>> q;//储存string型数据
priority_queue<结构体名,vector<结构体名>,greater<结构体名>> q;//储存结构体或者类 

比较函数

priority_queue<int,vector<int>,cmp> q;//储存int型数据 
priority_queue<double,vector<double>,cmp> q;//储存double型数据 
priority_queue<string,vector<string>,cmp> q;//储存string型数据
priority_queue<结构体名,vector<结构体名>,cmp> q;//储存结构体或者类 

重载运算符

bool operator < (const test t)const{//重载运算符
	return val<t.val;
}

常用函数

empty() 如果优先队列为空,则返回真 
pop() 删除第一个元素 
push() 加入一个元素 
size() 返回优先队列中拥有的元素的个数 
top() 返回优先队列中有最高优先级的元素 

四、algorithm中常用函数

1.sort( ) 用于排序,默认从小到大排。

int main()
{
	int a[]={1,5,2,3,-1};
	sort(a,a+5);
	for(int i=0;i<5;i++)
		cout<<a[i]<<" ";
 } 
//结果
-1 1 2 3 5

2.max( ):两数最大

int main()
{
	int a=3;
	int b=10;
	cout<<max(a,b);
 } 
//结果
10

3.min():两数最小

int main()
{
	int a=3;
	int b=10;
	cout<<min(a,b);
 } 
//结果
3

4.abs():求一个数的绝对值 ,只用于整型变量。

int main()
{
	int a=-1;
	int b=2;
	cout<<abs(a)<<" "<<abs(b)<<endl;
 } 
//结果
1 2

5.swap(): 交换 x 与 y 的值(传引用)

int main()
{
	int a=-1;
	int b=2;
	swap(a,b);
	cout<<a<<" "<<b<<endl;
}
//结果
2 -1

6.reverse(): 反转数组函数 (也可以反转部分元素)

int main()
{
	int a[]={1,2,3,4,5};
	reverse(a,a+5);
	for(int i=0;i<5;i++)
	cout<<a[i]<<" ";
 } 
//结果
5 4 3 2 1

7.fill():在某区间内填充某个值(适用于所有类型的数组,容器)

struct node{
	int a;
	string b;
}T[10];
int main()
{
	node t;
	t.a=1,t.b="t";
	fill(T,T+10,t);
	for(int i=0;i<10;i++)
	cout<<T[i].a<<" "<<T[i].b<<endl;
 } 
//结果
1 t
1 t
1 t
1 t
1 t
1 t
1 t
1 t
1 t
1 t

8.count() : 在数组中查找 x 在某区间出现的次数

int main()
{
	int a[]={1,2,3,3,4};
	cout<<count(a,a+5,3);
 } 
//结果
2

9.__gcd: 求两数的最大公因数 //注意:如果想求最大公倍数 = 两数相乘 / 最大公因数;

int main()
{
	int a=6;
	int b=12;
	cout<<__gcd(a,b)<<endl;
}
  1. next_permutation( ):给定的数组容器全排列。
int main()
{
	int a[] = {1,2,3};
	while(next_permutation(a,a+3))
	{
		for(int i=0;i<3;i++)
		cout<<a[i]<<" ";
		cout<<endl;
	}
 } 
//结果
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

五、pair

pair是将2个数据组合成一组数据,当一个函数需要返回2个数据的时候,可以选择pair。

构造:

pair<T1, T2> p1;            //创建一个空的pair对象(使用默认构造),它的两个元素分别是T1和T2类型,采用值初始化。
pair<T1, T2> p1(v1, v2);    //创建一个pair对象,它的两个元素分别是T1和T2类型,其中first成员初始化为v1,second成员初始化为v2。
make_pair(v1, v2);          // 以v1和v2的值创建一个新的pair对象,其元素类型分别是v1和v2的类型。
p1 < p2;                    // 两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。
p1 == p2;                  // 如果两个对象的first和second依次相等,则这两个对象相等;该运算使用元素的==操作符。
p1.first;                   // 返回对象p1中名为first的公有数据成员
p1.second;                 // 返回对象p1中名为second的公有数据成员

在创建pair对象时,必须提供两个类型名,两个对应的类型名的类型不必相同

 pair<int, double> p1;
 p1 = make_pair(1, 1.2);


int a = 8;
string m = "James";
pair<int, string> newone;
newone = make_pair(a, m);
posted @ 2024-03-22 00:12  YJQING  阅读(16)  评论(0)    收藏  举报