C++學習->set容器(STL)

一、關於set

set是C++標準庫中的一種關聯容器。所謂關聯容器就是通過鍵(key)來讀取和修改元素。與map關聯容器不同,它只是單純鍵的集合。set容器的每一個鍵只能對應一個元素,即不存在鍵相同的不同元素。與map容器不同,set容器不支持下標操作訪問元素。

set是STL中一種標準關聯容器。它底層使用平衡的搜索樹——紅黑樹實現,插入刪除操作時僅僅需要指針操作節點即可完成,不涉及到內存移動和拷貝,所以效率比較高。set,顧名思義是“集合”的意思,在set中元素都是唯一的,而且默認情況下會對元素自動進行升序排列,支持集合的交(set_intersection),差(set_difference) 並(set_union),對稱差(set_symmetric_difference) 等一些集合上的操作(求並、交、差、對稱差等操作,暫不細說,使用時要包含頭文件”algorithm”。 ),如果需要集合中的元素允許重複那麼可以使用multiset。

二、set中的常用成員函數

s.begin() –返回指向第一個元素的迭代器

s.clear() –清除所有元素

s.count(value) –返回某個值元素的個數

s.empty() –如果集合爲空,返回true

s.end() –返回指向最後一個元素的迭代器

s.equal_range(value )–返回集合中與給定值相等的上下限的兩個迭代器

s.erase(value) –刪除集合中的元素

s.find(value) –返回一個指向被查找到元素的迭代器

s.get_allocator() –返回集合的分配器

s.insert(value) –在集合中插入元素

s.erase() – 刪除一個元素

s.lower_bound(value) –返回指向大於(或等於)某值的第一個元素的迭代器

s.key_comp() –返回一個用於元素鍵值比較的函數

s.max_size() –返回集合能容納的元素的最大限值

s.rbegin() –返回指向集合中最後一個元素的反向迭代器

s.rend() –返回指向集合中第一個元素的反向迭代器

s.size() –集合中元素的數目

s.swap(int a,int b) –交換兩個集合變量

s.upper_bound(value) –返回大於某個值元素的迭代器

s.value_comp() –返回一個用於比較元素間的值的函數

三、代碼實現

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

int main(){
    //創建set容器集合 
    set<int>s;
    multiset<int>ms;
    int n,tmp;
    scanf("%d",&n);
    //插入數據元素 
    for(int i=0;i<n;i++){
        scanf("%d",&tmp);
        s.insert(tmp);
        ms.insert(tmp);
    }
    //迭代輸出容器元素 
    set<int>::iterator it1;
    multiset<int>::iterator it2;
    cout<<"s: "; 
    for(it1=s.begin();it1!=s.end();it1++){
        cout<<*it1<<" ";
    }
    cout<<endl;
    cout<<"ms: ";
    for(it2=ms.begin();it2!=ms.end();it2++){
        cout<<*it2<<" ";
    }
    cout<<endl;
    //查找
    s.lower_bound(5);
    s.upper_bound(5);
    ms.lower_bound(5);
    ms.upper_bound(5);
    int cnt=s.count(5);
    it1=s.find(5); 
    cout<<"cnt= "<<cnt<<endl;
    cout<<"it1= "<< *it1 <<endl;
    //刪除
    s.erase(5);
    ms.erase(5);
    //輸出 
    cout<<"s: ";
    for(it1=s.begin();it1!=s.end();it1++){
        cout<<*it1<<" ";
    }
    cout<<endl;
    cout<<"ms: ";
    for(it2=ms.begin();it2!=ms.end();it2++){
        cout<<*it2<<" ";
    }
    cout<<endl;
    //清空
    s.clear();
    ms.clear();
    return 0;
}

//結果:
//5
//11 5 5 6 2
//s: 2 5 6 11
//ms: 2 5 5 6 11
//cnt= 1
//it1= 5
//s: 2 6 11
//ms: 2 6 11 

四、set中的特殊函數

1.count函數和find函數

s.count(value)–返回某個值元素的個數
s.find(value)–返回一個指向被查找到元素的迭代器
若使用count()和find()函數查詢同一元素5,count()函數返回的是該元素在set容器中的數量,find()函數則返回指向該元素的迭代器。需要注意的是,雖然使用find()函數可以返回指向該元素的迭代器,但只能對其做讀操作,任何試圖修改鍵值的操作都是非法的。

2.lower_bound函數和upper_bound函數

s.lower_bound(value)–返回指向大於(或等於)某值的第一個元素的迭代器
s.upper_bound(value)–返回大於某個值元素的迭代器

3..equal_range函數

s.equal_range(value )–返回集合中與給定值相等的上下限的兩個迭代器
返回一對定位器,分別表示第一個大於或等於給定關鍵值的元素和 第一個大於給定關鍵值的元素,這個返回值是一個pair類型,如果這一對定位器中哪個返回失敗,就會等於end()的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章