STL小结
注意:While()的时候要注意清零。
要用到string的时候要加头文件#iclude<string>.
一.向量(vector) 连续存储的元素<vector>
在不知道要储存多少元素的情况下用vector,但是数据也不能太大。其实相当于数组。
#include<stdio.h>
#include<vector>
using namespace std;
int main()
{
int i;
vector<int>v;
vector<int>::iterator it;
for(i=0;i<5;i++)
{
v.push_back(i); //在容器的最后添加一个值为i的数据,容器的size变大。
}
for(i=0;i<v.size();i++) //返回容器中数据的个数
{
printf("%d\n",v[i]);
}
for(it=v.begin();it<v.end();it++)
{
printf("%d\n",*it);
}
v.clear(); //删除容器中的所有元素
return 0;
}
二.栈(stack) 后进先出的值的排列 <stack>
#include<stdio.h>
#include<stack>
using namespace std;
int main()
{
int i,l;
stack<int>v;
for(i=0;i<5;i++)
{
v.push(i); //在容器的top添加一个值为i的数据,容器的size变大。
}
l=v.size(); //返回容器中数据的个数
for(i=0;i<l;i++)
{
printf("%d\n",v.top()); //输出栈顶
v.pop(); // 移除栈顶元素。
}
return 0;
}
三.队列(queue) 先进先出的值的排列 <queue>
#include<stdio.h>
#include<queue>
using namespace std;
int main()
{
int i,l;
queue<int>q;
for(i=0;i<5;i++)
{
q.push(i); //在容器的最后添加一个值为i的数据,容器的size变大。
}
l=q.size(); //返回容器中数据的个数
while(!q.empty()) //是否为空
{
printf("%d\n",q.front()); //取队首
q.pop(); //移除队首元素
}
return 0;
}
四.集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 <set>
输入后会按顺序排列。
set/multiset会根据待定的排序准则,自动将元素排序。两者不同在于前者不允许元素重复,而后者允许。
1) 不能直接改变元素值,因为那样会打乱原本正确的顺序,要改变元素值必须先删除旧元素,则插入新元素
2) 不提供直接存取元素的任何操作函数,只能通过迭代器进行间接存取,而且从迭代器角度来看,元素值是常数
3) 元素比较动作只能用于型别相同的容器(即元素和排序准则必须相同)
4) 函数upper_bound()返回的在前闭后开区间查找的关键字的上界,如一个数组number序列1,2,2,4.upper_bound(2)后,返回的位置是3(下标)也就是4所在的位置,同样,如果插入元素大于数组中全部元素,返回的是last。(注意:此时数组下标越界!!)
5) 函数lower_bound()在first和last中的前闭后开区间进行二分查找,返回大于或等于val的第一个元素位置。如果所有元素都小于val,则返回last的位置
以杭电4585举例;
#pragma warning(disable:4786)
#include<stdio.h>
#include<set>
#include<map>
using namespace std;
main()
{
set<int>s;
map<int,int>mp;
set<int>::iterator it; //迭代器
int n,k,g,m,q;
while(scanf("%d",&n)!=EOF&&n)
{
s.clear(); //清空
mp.clear();
s.insert(1000000000); //插入
mp[1000000000]=1;
while(n--)
{
scanf("%d %d",&k,&g);
printf("%d ",k);
it=s.lower_bound(g);
if(it==s.end())
{
it--;
printf("%d\n",mp[*it]);
}
else
{
m=*it;
if(it!=s.begin())
{
it--;
if(g-(*it)<=m-g) printf("%d\n",mp[*it]);
else printf("%d\n",mp[m]);
}
else printf("%d\n",mp[m]);
}
s.insert(g);
mp[g]=k;
}
}
}
五.映射 (map) 由 { 键,值 } 对组成的集合,以某种作用于键对上的谓词排列 <map>
#pragma warning(disable:4786)
#include <map>
#include <string>
using namespace std;
int main()
{
map<string,int>mp;
int i;
mp["abc"]=1; //插入元素
i=mp["abc"]; //查找元素
printf("%d\n",i);
}
迭代器 map<string,int>::iterator it;
for (it=mp.begin(); it!=mp.end(); ++it) { }
mp.size() 返回元素数目mp.empty() 判断是否为空
mp.clear() 清空所有元素
六.优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 <queue>
杭电1896,1873;
优先队列就是大顶堆,队头元素最大。
#include <stdio.h>
#include <queue>
using namespace std;
int main()
{
priority_queue<int> q;
for( int i= 0; i< 10; ++i )
q.push( i );
while( !q.empty() )
{
printf("%d\n",q.top());
q.pop();
}
return 0;
}
如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
#include <stdio.h>
#include <queue>
using namespace std;
int main()
{
priority_queue<int, vector<int>, greater<int> > q;
for( int i= 0; i< 10; ++i )
q.push( i );
while( !q.empty() ){
printf("%d\n",q.top());
q.pop();
}
return 0;
}
对于自定义类型,则必须自己重载 operator< 或者自己写仿函数
#include <stdio.h>
#include <queue>
using namespace std;
struct Node
{
int x, y;
}T;
bool operator<( Node a, Node b ){
if( a.x== b.x ) return a.y > b.y; //从小到大
return a.x > b.x;
}
int main()
{
priority_queue<Node> q;
for( int i= 0; i< 10; ++i )
{
T.x=i;
T.y=9-i;
q.push(T);
}
while( !q.empty() )
{
printf("%d %d\n",q.top().x,q.top().y);
q.pop();
}
return 0;
}
priority_queue<int> q[k+10] 可以做一类题目,当然给定的k一定是一个不大的数。
七.String(一定要用c++输入输出)
#include<iostream>
#include<string>
using namespace std;
main()
{
int i;
string a,b;
cin>>a;
b="bbb";
a+=b;
if(a<b) cout<<a<<endl;
}