C++ set学习初步

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

codeforces 620 C. Pearls in a Row
大意:n个珠子排成一列,第i个位置的柱子属于特定的类别,如果不同位置的柱子属于同一个类别,那么任何包含它们的一段柱子称之为好的分段。求解分段的个数,并且输出分段的边界。
input

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.

分析:因为涉及到判重的问题,且输入的数字很大,所以可以使用C++ STL中的set

#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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值