关于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();
}