栈和队列都没有迭代器
vector,map,set有迭代器(iterator)
1.set
set< int > q; //集合
q.insert(x); //将x推入集合,内部已自动排序且无重复项,无需sort与unique
q.begin(); //集合的首地址
q.end(); //集合的尾地址
q.size();//集合的大小
set< int > ::iterator it;//迭代器,可以指向同类型的集合
it=–q.end();//最后一个元素地址
it=q.lower_bound(k);//求大于等于k的第一个数的地址 加为地址元素
it=q.upper_bound(k);//求大于k的第一个数的地址 加为地址元素
q.count(15);//集合是否有15的元素(二分查找),有返回1,没有返回0
q.erase(15);//删除15(也可以写入地址)
q.clear(); //清空set
ps:
multiset q;
可以存入重复元素,用法相同
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;
int main()
{
set<int> q;
q.insert(1);
q.insert(2);
q.insert(15);
q.insert(7);
q.insert(4);
set<int>::iterator it;
for(it=q.begin();it!=q.end();it++)
printf("%d ",*it);
//1 2 4 7 15
puts("");
int num=q.size();
printf("%d\n",num);//5
printf("%d %d\n",(int)q.count(15),(int)q.count(8));// 1 0
q.erase(15);
printf("%d\n",(int)q.count(15)); //0
q.erase(q.begin());//q.begin()是首地址,其中的元素为1
printf("%d\n",(int)q.count(1));// 0
}
2.multiset
与set用法大致相同
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <set>
using namespace std;
typedef long long ll;
multiset<int> q;
int main()
{
q.insert(5);q.insert(5);q.insert(7);
q.insert(6);q.insert(8);q.insert(4);
q.insert(40);q.insert(1);q.insert(2);
q.insert(2);q.insert(77);q.insert(17);
multiset<int>::iterator it;
for(it=q.begin();it!=q.end();it++) //1 2 2 4 5 5 6 7 8 17 40 77
printf("%d ",*it);
puts("");
it=q.find(5);
q.erase(it); //删除q中一个5(删除的是地址元素)
for(it=q.begin();it!=q.end();it++) //1 2 2 4 5 6 7 8 17 40 77
printf("%d ",*it);
puts("");
q.erase(2); //删除q中所有的2
for(it=q.begin();it!=q.end();it++) //1 4 5 6 7 8 17 40 77
printf("%d ",*it);
puts("");
it=q.end();//删除最后一个元素
q.erase(--it);
for(it=q.begin();it!=q.end();it++) //1 4 5 6 7 8 17 40
printf("%d ",*it);
puts("");
}
3.vector
q.push_back();//推入
q.size();//q的集合大小
q.begin();//第一个元素
q.end();// 最后一个元素的后一位
q.erase(unique(q.begin(),q.end()),q.end()); //截取重复的元素
sort(q.begin(),q.end())//对vector里的元素进行排序
q.erase(q.begin()+i,q.begin()+j);//删除区间[i,j-1]内元素 (区间从0开始)
q.insert(q.begin()+i,a);//在第i+1个元素前插入a
查找元素x是否在vector里:
vector::iterator it;
it=find(q.begin(),q.end(),x);
if(!(it!=q.end())) q.push_back(x);
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> q;
q.push_back(15);
q.push_back(6);
q.push_back(15);
q.push_back(8);
q.push_back(2);
q.push_back(27);
printf("%d\n",(int)q.size());//6
for(int i=0;i<q.size();i++)
printf("%d ",q[i]);
puts("");
//15 6 15 8 2 27
sort(q.begin(),q.end()); //2 6 8 15 15 27
for(int i=0;i<q.size();i++)
printf("%d ",q[i]);
puts("");
q.push_back(27);
q.push_back(28);
//2 6 8 15 15 27 27 28
for(int i=0;i<q.size();i++)
printf("%d ",q[i]);
puts("");
int pos=(int)(unique(q.begin(),q.end())-q.begin());//2 6 8 15 27 28 27 28
for(int i=0;i<q.size();i++)
printf("%d ",q[i]);
puts("");
for(int i=0;i<pos;i++)
printf("%d ",q[i]);
puts("");
//2 6 8 15 27 28
}
4.priority_queue
优先队列 队列头是 q.top();
普通队列 队列头是 q.front();
按照权值大小自定义排列
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <set>
#include <cmath>
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
struct node
{
int x,y;
bool operator < (const node &a)const
{
if(x!=a.x)
return x<a.x;
return y>a.y;
//除了优先队列是 先根据x从大到小,再根据y从小到大(与其他相反)
//其余的都是根据x从小到大,再根据y从大到小 排序
}
}tmp[10060];
int main()
{
tmp[0].x=1,tmp[0].y=4;
tmp[1].x=3,tmp[1].y=2;
tmp[2].x=2,tmp[2].y=3;
sort(tmp,tmp+3);
for(int i=0;i<3;i++)
printf("%d ",tmp[i].x);
puts("");
//1 2 3
priority_queue<node> q;
q.push(tmp[0]),q.push(tmp[1]),q.push(tmp[2]);
while(!q.empty())
{
node cur=q.top();
q.pop();
printf("%d ",cur.x);
}
puts("");
//3 2 1
set<node> qq;
qq.insert(tmp[0]),qq.insert(tmp[1]),qq.insert(tmp[2]);
for(set<node>::iterator it=qq.begin();it!=qq.end();it++)
{
printf("%d ",it->x);
}
puts("");
//1 2 3
}
5.queue
队列,先进先出的线形结构
常用函数:
queue q;
q.empty();//判断q是否为空,空返回1,非空返回0
q.pop();//弹出队列中的第一个元素,无返回值
q.push(x);//推入x元素
q.size();//q中的元素个数
q.front();//返回队列第一个元素
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
int main()
{
queue<int> q;
q.push(15);
q.push(4);
q.push(88);
q.push(64);
q.push(27);
printf("%d \n",q.front());//15
q.pop();
printf("%d \n",q.front());//4
q.push(55);//4 88 64 27 55
while(!q.empty())
{
q.pop();
}
//empty
}
6.map
string 为c++ 输出用cout ;
#include <cstdio>
#include <cstring>
#include <string>
#include <algorith>
#include <map>
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;
#define 第一键值 string
#define 第二键值 int
int main()
{
map<第一键值,第二键值> q;//一一对应的映射关系
q["sdf"]=5;
q["???"]=5;
q["fgh"]=7;
q["djy"]=8;
for(map<第一键值,第二键值>::iterator it=q.begin();it!=q.end();it++)//遍历map
{
cout<<it->first<<" "<<it->second<<endl;
}
// ??? 5
// djy 8
// fgh 7
// sdf 5
//按第一键值排序
q.count("++");//查找 “++” 有返回 1 没有返回 0
q.erase("fgh");//可以删除 “fgh” 元素
map<int,string> mp;
mp[1]="boy";
printf("%s\n",mp[1].c_str());
}
7.stack
先进后出
q.empty(); //堆栈为空则返回true
q.pop(); //移除栈顶元素
q.push(); //在栈顶增加元素
q.size(); //返回栈中元素数目
q.top(); //返回栈顶元素
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <stack>
using namespace std;
int main()
{
stack<int> q;
q.push(15);
q.push(4);
q.push(88);
q.push(64);
q.push(27);
printf("%d \n",q.top());//27
q.pop();
printf("%d \n",q.top());//64
q.push(55);
while(!q.empty())
{
printf("%d ",q.top());//55 64 88 4 15
q.pop();
}
//empty
}
8.string
string s;
cin>>s;
s.length()//返回s字符串的长度
sort(s.begin(),s.end())//对string类型进行排序
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>//cin cout
#define INF 0x3f3f3f3f
using namespace std;
int main()
{
string a="ab",b="abc";
a+=b;
a+="aasdafadsfasdas";
a+="h";
cout<<a<<endl;//ababcaasdafadsfasdash
cout<<a.find("aas")<<endl;//5
cout<<string::npos<<endl;//18446744073709551615
cout<<a.find(";;;")<<endl;//18446744073709551615
if(a.find(";;;;")==string::npos)
{
cout<<"no"<<endl;
}
}