C++的set容器有着许多方便使用的特性,比如set 可以“过滤”重复的文本单词(数字等),并且从小到大排好序,利用set的qset.count(number)可以返回number在qset中出现的次数(有则是1,无则是0),可以查看最大空间maxsize,查看已用空间size,插入insert(),删除erase(),但是容器带来便利的同时也带来了一些麻烦,比如反序遍历就显得流程较多。
#include <iostream>
#include<cstdio>
#include <set>
using namespace std;
int main(int argc, char *argv[]) {
freopen("cout.txt","w",stdout);
int a[10]={1,2,1,2,4,7,8,9,5,3},i;
set<int> number(a,a+10);
set<int>::iterator ix=number.begin();
for(;ix!=number.end();ix++)
cout<<*ix<<" ";
cout<<endl;
for(i=0;i<=10;i++)printf("%d出现的次数:%d\n",i,number.count(i));
for(i=11;i<20;i++)number.insert(i);
cout<<"maxsize: "<<number.max_size()<<endl;
cout<<"size: "<<number.size()<<endl;
for(ix=number.begin();ix!=number.end();ix++)
cout<<*ix<<" ";
cout<<endl;
for(ix=number.end();ix!=number.begin();ix--) //wrong
cout<<*ix<<" ";
cout<<endl;
set<int>::reverse_iterator iy=number.rbegin();
for(;iy!=number.rend();iy++)cout<<*iy<<" ";
cout<<endl;
return 0;
}
结果:
1 2 3 4 5 7 8 9
0出现的次数:0
1出现的次数:1
2出现的次数:1
3出现的次数:1
4出现的次数:1
5出现的次数:1
6出现的次数:0
7出现的次数:1
8出现的次数:1
9出现的次数:1
10出现的次数:0
maxsize: 214748364
size: 17
1 2 3 4 5 7 8 9 11 12 13 14 15 16 17 18 19
17 19 18 17 16 15 14 13 12 11 9 8 7 5 4 3 2
19 18 17 16 15 14 13 12 11 9 8 7 5 4 3 2 1
The first line contains integer n (1 ≤ n ≤ 3·105) — the number of pearls in a row.
The second line contains n integers ai (1 ≤ ai ≤ 109) – the type of the i-th pearl.
#include <iostream>
#include <stdio.h>
#include <set>
using namespace std;
const int N = 3e5+5;
int cnt[N];
int top;
int main()
{
int n, i, tmp;
while(~scanf("%d",&n)){
set<int> st;
top = 0;
for(i=0;i<n;i++){
scanf("%d",&tmp);
if(st.count(tmp) == 0){
st.insert(tmp);
}
else {
st.clear();
cnt[top++] = i+1;
}
}
if(top>0){
printf("%d\n",top);
int left = 1;
for(i=0;i<top-1;i++){
printf("%d %d\n",left,cnt[i]);
left = cnt[i]+1;
}
cnt[top-1] = n;
printf("%d %d\n",left,cnt[top-1]);
}
else printf("-1\n");
}
return 0;
}