STL常用容器和常用函数

写在前面:这又是四月份了,以往每年的这个时候蓝桥省赛都早早结束了,今年受这新冠病毒影响,高考蓝桥四六级等等都往后延期,想必也是前无古人了,希望也是后无来者吧!由于今年蓝桥延后,咱现在还是暂未开学啊,备赛时间也是无比的长,这几天玩的可嗨,静下心来水一篇博客。STL在我们的平日代码题目数据结构题目中可以大大减少我们的代码量,他一个函数就可以解决你的排序、去重、全排列。

主题:蓝桥杯大赛巧用C++中的STL容器和函数

我认为比较常用的STL容器有这几个:queue、set、vector、string

常用的STL算法有这几个:sort、next_permutation和prev_permutation函数

目录

主题:蓝桥杯大赛巧用C++中的STL容器和函数

一、queue容器

二、set容器

三、vector容器

四、string容器

五、sort函数

默认字典升序排序

使用cmp自定义排序类型:

六、next_permutation和prev_permutation函数

 


一、queue容器

queue——队列,里面的元素服从先进先出,通俗讲就是你按顺序把123456放进去,往外取的时候,顺序还是123456,这个在写广搜的时候,应用很广泛(因为广搜中你先遍历到的点后边遍历要优先考虑)。你可以把他想象为一个桶,你今天往里扔东西,取得时候先拿到的是最先扔进去的那个。

常用操作方法:

首先必须引用头文件:#include <queue>

定义一个队列(尖括号里是队列里元素的类型,可以很多种,结构体也可以且是常用的):queue<int >q;

插入一个元素:q.push(a);

返回队首元素:q.front();

弹出队首元素: q.pop();

查询队列长度: q.size();

查询队列是否为空(返回值为bool类型的true或false):q.empty(); 

查询队尾元素:q.back();

注意:

(1)必须是C++,要有using namespace std;

(2)必须引用头文件:#include <queue>

(3)取完队首元素之后,队首元素要弹出,不然你一直取得都是他。取只是取值,并没有把它从桶里拿出来,把他拿出来后边的元素才有机会出来。

实例:

#include <stdio.h>
#include <queue>
using namespace std; 
int main()
{
	queue<int >q;                       //定义存储类型为int的队列 
	int x;
	printf("输入五个整数:");
	for(int i = 1;i<=5;i++)
	{
		scanf("%d",&x);
		q.push(x);				        //每个x都入队 
	}
	printf("全部出队为:\n");
	while(!q.empty())			        //当q不为空时 
	{
		printf("%d ",q.front());		//输出队首元素 
		q.pop();						//弹出队首元素,队列长度减小
		printf("队列现在的大小:%d\n",q.size()); 
	}
	return 0;
}

测试运行:

二、set容器

set有一个特点,他里面的元素只出现一次,也就是你只要放进去的元素,不会有重复的,你要放重复的,他不会给你放进去的,那这个特点可以用来有效地去重。而且,进入set的元素,都会自动进行字典排序。这个set遍历要用迭代器,就是指向内部元素的一种指针。

常用操作方法:

返回某个值元素的个数:count();

如果集合为空,返回true:empty();

返回指向最后一个元素的迭代器:end();

返回指向第一个元素的迭代器:begin();

删除集合中的元素:erase();

返回一个指向被查找到元素的迭代器:find();

在集合中插入元素:insert();

集合中元素的数目:size();

实例:

#include <stdio.h>
#include <set>
using namespace std; 
int main()
{
	set<int >s;                 //定义存储类型为int的set
	int x;

	printf("输入五个整数:");
	for(int i = 1;i<=5;i++)
	{
		scanf("%d",&x);
		s.insert(x);				//每个x放入set容器 
	}
	if (s.find(3)!=s.end())                //查找元素3 
	    printf("Y\n"); 
	else                 
	    printf("N\n"); 
	s.erase(3);						//删除元素3 
	if (s.find(3)!=s.end())   				//再次查找元素3 
	    printf("Y\n"); 		
	else                 
	    printf("N\n"); 
	printf("%d\n",s.size()); 			//容器大小 
	printf("遍历set容器:\n");
	for (set<int>::iterator it = s.begin(); it != s.end(); it++)    //迭代器遍历容器 
	{
	printf("%d",*it); 	
	}
	return 0;
}

测试运行:

三、vector容器

类似于数组用法,可以直接使用下标取值,但是不能使用下标赋值!!!特点就是相关函数的使用,计算数组大小,是否为空

常用操作:

定义v容器:

vector<T> v1;               //vevtor保存类型为T的对象。默认构造v1为空。
vector<T> v2(v1);           //v2是v1的一个副本,v1和v2的元素类型必须相同
vector<T> v3(n,i);          //v3包含n个值为i的元素
vector<T> v4(n);           //v4包含初始化的元素的n个副本,默认元素值为0

把x放入容器:push_back(x);    

容器大小:size();

容器判空:empty();

实例:

#include <stdio.h>
#include <vector>
using namespace std; 
int main()
{
	vector<int >v;                 //定义存储类型为int的v
	int x;

	printf("输入五个整数:");
	for(int i = 1;i<=5;i++)
	{
		scanf("%d",&x);
		v.push_back(x);				//每个x放入v容器 
	}
	for(int i=0;i<v.size();i++)    //遍历v的大小 
	{
		printf("%d\n",v[i]);
	}
	
	return 0;
}

测试运行:

四、string容器

类似char数组但是比其更好用,可以直接进行加减或相关函数的使用

常用操作:

定义s容器:
     string s1;   //初始化字符串,s1为空
     string s2 = s1;? //复制初始化,复制s1到s2
     string s3 = "test"; //直接初始化,s3是“test”
     string s4(10, 'a'); //s4=“aaaaaaaaaa”
     string s6("test"); //直接初始化
字符串拼接:直接加减:s+="xxxx";s+=s1;
字符串查找:find("te");
0-2位置替换:replace(0, 2, "tt");
比较s1、s2:s1.compare(s2)
取1-3位置子串:substr(1, 3);
插入到3位置前:insert(3, "tt");
删除0-2位置字符:erase(0, 2);

实例:

#include <stdio.h>
#include <iostream>
#include <string>
using namespace std; 
int main()
{
	string s = "0123456";               //定义s 
	string s2 = "789";					//定义s2 
	cout<<s.find("34")<<endl;			//在s查找"34" 
	cout<<s.compare(s2)<<endl;			//比较s和s2 
	s.replace(0, 2, "***");//替换 
	cout<<s<<endl;
	string s3 = s.substr(1, 3);//取子串 
	cout<<s3<<endl;
	s.insert(5, "---");//插入 
	cout<<s<<endl;
	s.erase(0, 4);//删除 
	cout<<s<<endl;
	s+=s2;//叠加 
	cout<<s<<endl;
	return 0;
}

测试运行:

五、<algorithm>中的sort函数

默认字典升序排序

排序函数,默认升序排序,时间复杂度n*lg(n),属于优化过的快速排序

使用方法:

升序排序a[0]到a[9]:sort(a,a+10);

实例:

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	int a[110] = {1,3,5,8,7,4,1,2,3,6,9,8,0};
	sort(a,a+10);
	for(int i=0;i<13;i++)
		cout<<a[i]<<" ";
	return 0;
} 

测试运行:

使用cmp自定义排序类型:

单纯的升序排序不可能满足所有人的需求,,那就可以重写传参函数cmp作为sort的字三个参数,进行自定义的排序方法,写函数的方法有很多种,比如结构体排序中你可以使用结构体的某一个元素进行排序等

实例:

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp1(int a,int b)//传参为排序数据类型
{
    return a>b;//降序排列(你需要的排序规则) 
}
int main()
{
	int a[110] = {1,3,5,8,7,4,1,2,3,6,9,8,0};
	sort(a,a+10,cmp1);
	for(int i=0;i<13;i++)
		cout<<a[i]<<" ";
	return 0;
} 

测试结果:

六、<algorithm>中的next_permutation和prev_permutation函数

两个全排列函数,next是下一个排列,prev是上一个,,,他会根据你的传参进行字典序的全排列,所以

注意:你使用这个函数之前,必须确保你传给他的数据是单调的(可以sort()一下),不然他会排列不完整!!!!

说明:比如你给next传参“231”,他会找字典序下一个排序,而“123”这个序列是在他的上边,会遍历不到这个序列的!!!

使用方法:

使用do-while,将函数放在while中,处理语句放在do中,排序出来的序列还是存在原数组,然后进行下一步字典排列,,,一定要注意,你在do中不能对数组元素进行赋值等操作,只能取值,,因为赋值会对下一步的全排产生影响!!!!

实例:

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
	char a[110] = "123";
	do
	{
		for(int i =0;i<6;i++)
			printf("%c ",a[i]);
		printf("\n");
		
	}
	while(next_permutation(a,a+3));
	return 0;
} 

测试运行:

总的来说,用这些容器可以减少我们的代码量,用法很多,注意事项也挺多,暂时我了解的也就这么点,只能分享这一点,后期我学习到其他的会再来的,,有什么经验交流或其他欢迎评论,或者Q我2905257286

猜你喜欢

转载自blog.csdn.net/qq_41170600/article/details/105455961
今日推荐