STL-set 容器以及迭代器的簡單理解


先說下set的基本操作和時間復雜度

begin()        ,返回set容器的第一個元素

end()      ,返回set容器的最后一個元素

clear()          ,刪除set容器中的所有的元素

empty()    ,判斷set容器是否為空

max_size()   ,返回set容器可能包含的元素最大個數

size()      ,返回當前set容器中的元素個數

find()             , 如果找到返回其位置,找不到返回end()

其中插入和find的時間復雜多是O(logn)

再說下迭代器的用法 iterator是指針的一種泛化 http://www.daxueit.com/article/3101.html 這里有詳細的介紹

下面給出一個實驗代碼 用來測試find 以及iterator的指向作用 *it表示訪問it表示的實體

set<int> s;
int a,b,c;
cin>>a>>b>>c;
s.insert(a);
s.insert(b);
s.insert(c);
set<int>::iterator it;
it=s.find(b);
cout<<*it<<endl;

這里給出一個用set容器的題目

l2-005 集合相似度

給定兩個整數集合,它們的相似度定義為:Nc/Nt*100%。其中Nc是兩個集合都有的不相等整數的個數,Nt是兩個集合一共有的不相等整數的個數。你的任務就是計算任意一對給定集合的相似度。

輸入格式:

輸入第一行給出一個正整數N(<=50),是集合的個數。隨后N行,每行對應一個集合。每個集合首先給出一個正整數M(<=104),是集合中元素的個數;然后跟M個[0, 109]區間內的整數。

之后一行給出一個正整數K(<=2000),隨后K行,每行對應一對需要計算相似度的集合的編號(集合從1到N編號)。數字間以空格分隔。

輸出格式:

對每一對需要計算的集合,在一行中輸出它們的相似度,為保留小數點后2位的百分比數字。

輸入樣例:

3
3 99 87 101
4 87 101 5 87
7 99 101 18 5 135 18 99
2
1 2
1 3

輸出樣例:

50.00%
33.33%

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<set>
using namespace std;
set<int> s[55];
void f(int x,int y)
{
    int ret=0;
    set<int>::iterator it;//
    for(it=s[x].begin();it!=s[x].end();it++)
    {
        if(s[y].find(*it)!=s[y].end()) ret++;
       // if(s[y].count(*it)==0) ret++;
    }
    int sum=s[x].size()+s[y].size();
    int nc=ret,nt=sum-ret;
    double temp=(nc*1.0)/(nt*1.0);
    printf("%.2lf",temp*100);
    cout<<'%'<<endkl;
}
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++) s[i].clear();
    for(int i=1;i<=n;i++)
    {
       int len;
       cin>>len;
       while(len--)
       {
           int x;
           cin>>x;
           s[i].insert(x);
       }
    }
    int k;
    cin>>k;
    while(k--)
    {
        int x,y;
        cin>>x>>y;
        f(x,y);
    }
    return 0;
}

路漫漫其修遠兮,吾將上下而求索


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM