STL的基本结构:
STL 是 C++ 通用库,由迭代器、算法、容器、仿函数、配接器和配置器(即内存配置器)组成。
一、栈(Stack)
头文件:#include < stack>
定义:stack< data_type> stack_name;
如:stack < int> s;
操作:
empty() — — 返回bool型,表示栈内是否为空(s.empty())
size() — — 返回栈内元素个数(s.size())
top() — — 返回栈顶元素值(s.top())
pop()— — 移除栈顶元素(s.pop();)
push(data_type a)— —向栈压入一个元素a (s.push(a);)
栈是一种先进后出的数据结构
例:
#include <iostream>
#include <stack>
#include <algorithm>
using namespace std;
int main(){
stack<int>s;
s.push(1); //向栈内压入元素1,2,3
s.push(2);
s.push(3);
cout <<"Top:"<<s.top()<<endl; //输出栈顶元素
cout <<"Size:"<<s.size()<<endl; //输出栈内元素个数
s.pop(); //移除栈顶元素3
cout <<"Size:"<<s.size()<<endl;
if(s.empty()) //判断栈内是否为空
{
cout <<"Is empty"<<endl;}
else{
cout <<Is not empty"<<endl;}
return 0;
}
二、队列(queue)
头文件:#include < queue>
定义:queue < data_type>queue_name;
如: queue < int> q;
操作:
empty()— — 返回bool型,表示queue是否为空(q.empty())
size() — — 返回queue内元素个数(q.size())
front() — —返回queue内的下一个元素(q.front())
back() — —返回queue内的最后一个元素(q.back())
pop() — —移除queue中的一个元素(q.pop();)
push(data_type a)— —将一个元素a置入queue中(q.push(a))
队列是一种先进先出的数据结构
例:
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
int main(){
queue<int> s;
s.push(1);
s.push(2);
s.push(3);
cout <<"Front:"<<s.front()<<endl; //输出元素1
cout <<"Back:"<<s.back()<<endl; //输出元素3
s.pop(); //删除元素1
cout <<"Size:"<<s.size()<<endl;
cout <<"Front:"<<s.front()<<endl; //输出元素2
cout <<"Back:"<<s.back()<<endl; //输出队列中的最后一个元素3
return 0;
}
三.vector(动态数组)
头文件:#include < vector>
定义:vector < data_type> vector_name;
如:vector < int> v; vector< double> v; vector< string> v;
操作:
empty() — — 返回bool型,表示vector是否为空(v.empty())
size() — —返回vector内元素个数(v.size())
push_back(data_type a)将元素a插入最尾端
pop_back()将最尾端元素删除
v[i]类似数组取第i个位置的元素(v[0])
vector可以很好解决的数组越界问题,并且可以在数组的任意位置添加一个元素和删除一个元素
插入元素:v.insert(v.begin()+i,a) 在第i+1个元素前面插入a;
删除元素:v.erase(v.begin()+2) 删除第3个元素
v.erase(v.begin()+i,v.end()+j) 删除区间[i,j-1];区间从0开始
清空:v.clear()
例:
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main(){
vector<int> a;
for (int i=0;i<5;++i){
a.push_back(5-i);
}
cout<<"Size:"<<a.size()<<endl;
a.pop_back();
a[0]=1; //直接给第0个元素赋值为1
cout <<"Size:"<<a.size()<<endl;
for(int i=0;i<(int)a.size();++i){ //强制将元素个数转换为整型
cout <<a[i]<<","<<endl;
}
cout <<endl;
return 0;
}
四、sort(排序)
头文件:#include < algorithm>
sort (begin,end);
sort (begin,end,cmp);
例:
int num[]={1,5,6,2,9};
- sort (num,num+5); //默认从小到大排序
2)bool cmp(int a,int b){ return a>b;}
sort(num,num+5,cmp);
//从大到小
sort在vector中的使用
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
int a[10];
vector <int> b;
for (int i=0;i<5;i++)
{
cin >>a[i];
b.push_back(a[i]); //给向量b输入元素
}
sort(a,a+5);
sort(b.begin(),b.end()); //begin返回第一个元素位置,end返回第一个无效元素的位置,begin,end为迭代器对象,用来储存元素的位置
for (int i=0;i<5;i++)
cout <<a[i]<<" ";
cout <<endl;
for (int i=0;i<5;i++)
cout <<b[i]<<" ";
return 0;
五、优先队列(priority_queue)
头文件:#include <queue>
定义:priority_queue <data_type> priority_queue_name;
如:priority_queue <int> q; //默认是大顶堆(最大值在前)
操作:
q.push(elem) 将元素elem置入优先队列
q.top() 返回优先队列的下一个元素
q.pop() 移除一个元素
q.size() 返回队列中元素的个数
q.empty() 返回优先队列是否为空
优先队列是一个有权值观念的queue,会优先将极大值或者极小值排在最前面,极大值称为大堆,极小值成为小堆
例:
#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
#define pow2(a) ((a)*(a)) //宏定义,a²=a*a
#define dist2(x,y)(pow2(x)+pow2(y)) //宏定义,距离²=x²+y²
struct coord{
int x,y;
const bool operator<(const coord &b)const{ //重载运算符<,当前点和代入点b进行比较,若当前点距离的平方和大的话则进行交换
return (dist2(x,y)<dist2(b.x,b.y);
};
int main(){
priority_queue<coord> s; //将结构体放入优先队列中
coord a;
a.x=3,a.y=2;
s.push(a); //输入(3,2)=13
a.x=1,a.y=2;
s.push(a); //输入(1,2)=5
a.x=2,a.y=2;
s.push(a); //输入(2,2)=8
cout <<"Size:"<<s.size()<<endl;
cout <<"Top:"<<s.top().x<<","<<s.top().y<<endl; //输出大顶堆(3,2)
s.pop(); //删除大顶堆(3,2)
cout <<"Top:"<<s.top().x<<","<<s.top().y<<endl; //输出此时的大顶堆(2,2)
return 0;
}