1. 程式人生 > >set的使用03(較多的操作函式)

set的使用03(較多的操作函式)

1367: Data Structure
Time Limit: 1 Sec Memory Limit: 128 MB
[Submit][Status][Web Board]
Description

給出一個集合,初始為空,進行N次操作,操作分為三種:
1 往集合中新增一個元素,如果集合中已經存在,則無需重複新增
2 從集合中刪除一個元素,如果集合中不存在該元素,則無需刪除
3 判斷元素在集合中排行老幾(最小的是老大),如果元素不存在請輸出:“sorry”(不含雙引號)

Input

多組測試資料
每組第1行:1個整數N,表示操作的次數。(2<=N<=10000)
第2 - (N+1)行:每行2個整數k和s對應操作的方式和被操作的元素(1<=k<=3,1<=s<=1000000)

Output

對應與每一個操作3,給出相應的結果

Sample Input

8
3 1
2 1
1 1
1 1
1 2
3 2
2 2
3 2
5
1 1
1 100
1 1000000
2 99999
3 1000000

Sample Output

sorry
2
sorry
3

HINT

Source
AC程式碼~:

#include <stdio.h>
#include <set>
#include <algorithm>
using namespace std;
set<int>s;
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        s.clear();
        set<int>::iterator it;
        while(n--)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            switch(x)
            {
            case 1:
                s.insert(y);
                break;
            case 2:
                if(s.count(y))
                    s.erase(y);
                break;
            case 3:
                if(s.count(y))
                {
                    int c = 0;
                    for(it = s.begin(); it != s.find(y); it++)
                        c++;
                    printf("%d\n",++c);
                }
                else
                    printf("sorry\n");
                break;
            }
        }
    }
    return 0;
}

總結:
set的迭代器不能執行加減運算,這題case3部分困擾我好久,一直想借助
find.s(y)-s.begin()來解決,但是發現編譯一直報錯,最後查了一下發現set迭代器不能加減法運算。最後我換了中思路瞭解決case3的問題,我本以為會Time exceed limited,沒想到AC了,哈哈哈開心~
總結進入正文~—>:

1.  s.clear();//清空容器set
2.  set<int>::iterator it;//迭代器,名字叫it,它有點像指標~(功能一樣的)
3.  s.insert(x);//將x插入set
4.  s.count(y);//判斷set中是否存在y,~~不要寫成(s.cout)~~ 
5.  s.begin();//叫s的set容器首地址
6.  s.erase(x);//在set容器中刪除x
7.  s.find(y);//set中找到元素y並返回它的地址