小萌新蓝桥杯的入坑之路(一):关于STL

关于c++常用的STL基础功能介绍:vector,queue,stack,map,set(一些用法借用计蒜客培训,望大佬莫喷)
1、set:集合,具有自动删除与排序功能

#include<iostream>
#include<cstring>
#include<set>
using namespace std;
int main()
{
	set<string> country;//创建一个set的集合 
	country.insert("China");//插入 
	country.insert("America");
	country.insert("France");
	set<string>::iterator it;//通过迭代器器对set集合里的元素进行操作 
	for(it=country.begin();it!=country.end();it++){
		cout<<*it<<" ";
	}
	cout<<endl;
	country.erase("America");//删除元素 
	for(it=country.begin();it!=country.end();it++){
		cout<<*it<<" ";
	}
	cout<<endl;
	if(country.count("China")){//查找 
		cout<<"China in country."<<endl;
	} 
	country.clear();//清除 
	return 0;
	
}

(2)用set实现集合的交并差对称差(引用别人的方法)

#include <algorithm>
#include <iostream>
#include <set>
using namespace std;
 
int main()
{
       int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
       set<int> S( a, a + 9 );
      
       int b[] = { 3, 6, 8, 9 };
       set<int> S2( b, b + 4 );
      
       set<int>::iterator site;
 
       set<int> Su;
       set<int> Si;
       set<int> Sd;
       set<int> Ssd;
      
       //交集
       set_intersection( S.begin(), S.end(),S2.begin(), S2.end(),inserter( Si, Si.begin() ) );
                                  
       //并集
       set_union( S.begin(), S.end(),S2.begin(), S2.end(),inserter( Su, Su.begin() ) );
                       
       //差集
       set_difference( S.begin(), S.end(),S2.begin(), S2.end(),inserter( Sd, Sd.begin() ) );
      
       //对称差集
       set_symmetric_difference( S.begin(), S.end(),S2.begin(), S2.end(),inserter( Ssd, Ssd.begin() ) );
                                                
      
       site = Si.begin();
       cout<<"the intersection of S and S2 is : ";
       while( site != Si.end() )
       {
              cout<< *site <<" ";
              ++ site;
       }
       cout<<endl;
      
       site = Su.begin();
       cout<<"the union of S and S2 is : ";
       while( site != Su.end() )
       {
              cout<< *site <<" ";
              ++ site;
       }
       cout<<endl;
      
       site = Sd.begin();
       cout<<"the difference of S and S2 is : ";
       while( site != Sd.end() )
       {
              cout<< *site <<" ";
              ++ site;
       }
       cout<<endl;
      
       site = Ssd.begin();
       cout<<"the symmetric difference of S and S2 is : ";
       while( site != Ssd.end() )
       {
              cout<< *site <<" ";
              ++ site;
       }
       cout<<endl;
      
       return 0;
}

2、map(类似于hash表),其实我理解就是一种逻辑关系

#include<iostream>
#include<string>
#include<map>
using namespace std;
int main()
{
	map<string,int>dict;//定义一个dict的map 
	dict["Tom"]=1;
	dict["Jone"]=2;
	dict["Mary"]=3;
	if(dict.count("Mary")){
		cout<<"Marry is in class "<<dict["Mary"];
		dict["Mary"]=5;
	}
	for(map<string,int>::iterator it =dict.begin();it!=dict.end();it++){
		cout<<it->first<<"is in class"<<it->second<<endl;//输出map里第一个与第二个 元素 
	}
	dict.clear();//删除 
}

3、vector动态数组很方便
(1)基础操作:(一维)

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	vector<int> v;
	for(int i=1;i<=10;i++){
		v.push_back(i*i);
	}
	for(int i=0;i<v.size();i++){
		cout<<v[i]<<" ";
	}
}

(2)二位vector的动态数组

#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int main()
{
	int n=5; 
	vector<vector<int> >vec2;
	for(int i=0;i<n;i++){
		vector<int> x(i+1,1);
		vec2.push_back(x); 
	}
	for(int i=0;i<n;i++){
		for(int j=0;j<vec2[i].size();j++){
			cout<<vec2[i][j]<<" ";
		}
		cout<<endl;
	}
 } 

输出结果类似于杨辉三角

4、Stack(栈):后进先出
(1)手动实现一个基础的栈

#include<iostream>
using namespace std;
struct Stack{
	int data[10000];
	int top=-1;
	void push(int x){
		top++;
		if(top<10000){
			data[top]=x;
		}else{
			top--;
			cout<<"stack overflow"<<endl;
		}
	}
	void pop(){
		if(top>=0){
			top--;
		}
	}
	int topval(){
		if(top>=0){
			return data[top];
		}
	}
};
int main()
{
	Stack s;
	for(int i=1;i<=10;i++){
		s.push(i);
	}
	for(int i=1;i<=10;i++){
		cout<<s.topval()<<" ";
		s.pop();
	}
	return 0;
}

(2)用栈来解决汉诺塔问题

#include<iostream>
#include<stack>
using namespace std;
stack<int> S[3];
void move(int x,int y){
	int temp=S[x].top();
	S[x].pop();
	S[y].push(temp);
	cout<<x<<"--->"<<y<<endl;
}
void hanoi(int A,int B,int C,int n)
{
	if(n==1){
		move(A,C);
		return; 
	}
	hanoi(A,C,B,n-1);
	move(A,C);
	hanoi(B,A,C,n-1); 
}
int main()
{
	int n;
	cin>>n;
	for(int i=n;i>=1;i--){
		S[0].push(i);
	}
	hanoi(0,1,2,n);
	while(!S[2].empty()){
		cout<<S[2].top()<<" ";//栈顶元素 
		S[2].pop();
	}
	return 0;
 } 

5、队列queue:先进先出,对于广度优先搜索很有帮助
(1)基础用法

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	queue<int> q;
	q.push(1);
	q.push(2);
	q.push(3);
	while(!q.empty()){
		cout<<q.front()<<endl;
		q.pop();
	}	
	return 0;
}

(2)实现莫比乌斯环

#include<iostream>
#include<queue>
using namespace std;
int main()
{
	int n,m;


	cin>>n>>m; 
	queue<int>q;
	for(int i=1;i<=n;i++){
		q.push(i);
	}
	int cur=1;
	while(q.size()>1){
		int x=q.front();
		q.pop();
		if(cur==m){
		cur=1; 
	}else{
			q.push(x);
			cur++;
	}
	} 
	cout<<q.front();
 }
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值