文章出處

set-概述:

  集合Set是一個容器,它其中所包含的元素的值是唯一的。集合中的元素按一定的順序排列,并被作為集合中的實例。
一個集合通過一個鏈表來組織,其具體實現采用了紅黑樹的平衡二叉樹的數據結構。
在插入操作和刪除操作上比向量(Vector)快,但查找或添加末尾的元素時會有些慢。
 
 

set c

產生一個空的set/multiset,其中不含任何元素

set   c (op)

以op為排序準則,產生一個空的set/multiset

set   c1(c2)

產生某個set/multiset的副本,所有元素均被復制

set   c (beg, end)

以區間[beg;   end]內的元素產生一個set/multiset

set   c (beg, end, op)

以op為排序準則,利用[beg;   end]內的元素生成一個set/multiset

c.~   set ()

銷毀所有元素,釋放內存

 
 

iterator begin()

iterator end()

返回指向第一個元素的迭代器

返回指向末尾(最后一個元素之后)的迭代器

void   clear()

清空set容器

bool   empty()

如果為空返回true,否則返回false

iterator   insert(TYPE &val   )

插入一個元素,返回新元素的位置

iterator   insert(iterator pos, TYPE &val)

插入一個元素,返回插入元素的位置(pos是一個提示,指出插入操作的搜尋起點。如果提示恰當,可大大加快速度)

void   insert(input_iterator   start, input_iterator   end )

插入[start,   end)之間的元素到容器中

void   erase(iterator pos)

void   erase(iterator start, iterator end)

size_type   erase(const   TYPE &val)

刪除pos所指元素

刪除[start,   end)之間的元素

刪除值為val的元素并返回被刪除元素的個數

size_type   count(const   TYPE &val)

查找容器中值為val的元素的個數

iterator   find(const   TYPE &val)

返回一個迭代器指向鍵值為val的元素,如果沒有找到就返回end()

size_type   size()

返回元素的數量

void   swap(set &object)

交換兩個鏈表中的元素

 
 
 
題目練習:
(會陸續添加)
這個題先看一下不用STL的解法:
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
using namespace std;

char *a[10000];
char b[10000];
    
int main()
{
    while (gets(b) && b[0] !='#')
    {
        int flag = 0;
        char *p = b;
        int i = 0;
        int num = 0;
        memset(a, 0 ,sizeof(a));
        while ( (a[i] = strtok(p, " ")) != NULL)
        {
            i ++;
            p = NULL;
        }
        for (int j = 0; j<i; j++)
        {
            num = 0;
            for (int k = j+1; k<i; k++)
            {
                if (strcmp(a[j],a[k]) == 0)
                    num++;
            }
            if (num != 0)
                flag ++;
        }
        cout << i-flag<< endl;
    }
    return 0;
}
View Code

 

有人用map解的:

#include<map>
#include<string>
#include<iostream>

using namespace std;

int main(){
    string s;
    map<string,int>Map;
    while(getline(cin,s)&&s!="#")
    {
        int a=0;
        string str;
        Map.clear();
        int len=s.length();
        for(int i=0;i<len;i++){
            if(s[i]=='#')
                break;
            str.clear();
            while(s[i]>='a'&&s[i]<='z'){
                str+=s[i];
                i++;
                a=1;
            }
            if(a==1)
            {
                Map[str]++;
                a=0;
            }
        }
        int ans=Map.size();
        cout<<ans<<endl;
    }
    return 0;
}
View Code

 

不過, 草灘小恪感覺此題還是用set切, 切的更清晰, 更爽些!

#include<iostream>
#include<string>
#include<sstream>
#include<set>
using namespace std;

const int MAXN = 100000;

char line[MAXN];

int main()
{
    set<string>s;
    while(cin.getline(line, MAXN))
    {
        if(line[0]=='#') break;
        s.clear();
        stringstream ss(line);
        string str;
        while(ss>>str)
        s.insert(str);
        cout<<s.size()<<endl;
    }
    return 0;
}
View Code

 


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()