STL set 常見用法詳解


《算法筆記》學習筆記

set 常見用法詳解

**set是一個內部自動有序且不含重復元素的容器 **

1. set 的定義

//單獨定義一個set
set<typename> name;

//這里的typename可以是任何基本類型
set<int> name;
set<double> name;
set<char> name;
set<node> name; //node是結構體的類型

//如果typename是一個STL容器,那么定義時要記得在>>符號之間加上空格
set<vector<int> > name;

//set的數組定義
set<typename> Arrayname[arraySize];
//Arrayname[0]~Arrayname[arraySize - 1]中的每一個都是set容器
set<int> a[100];

2. set 容器內元素的訪問

//set 只能通過迭代器(iterator)訪問
set<typename>::iterator it;

//迭代器定義
//set內的元素自動遞增排序,且自動去除了重復元素
//得到迭代器,並且可以通過*it來訪問set里的元素
set<int>::iterator it;
set<char>::iterator it;

//除開vector和string之外的STL容器都不支持*(it + i)的訪問方式
#include <stdio.h>
#include <set>
using namespace std;
int main() {
    set<int> st;
    st.insert(3);   //insert(x)將x插入set中
    st.insert(5);
    st.insert(2);
    st.insert(3);
    //注意,不支持it < st.end()的寫法
    for(set<int>::iterator it = st.begin(); it != st.end(); it++) {
        printf("%d", *it);
    }
    return 0;
}

3. set 常用函數實力解析

**(1) insert() **

// insert(x)可將 x 插入 set 容器中,並自動遞增排序和去重,時間復雜度O(logN)  

**(2) find() **

//find(value)返回set中對應值為value的迭代器,時間復雜度為O(logN)
#include <stdio.h>
#include <set>
using namespace std;
int main() {
    set<int> st;
    for(int i = 1; i <= 3; i++) {
        st.insert(i);
    }
    set<int>::iterator it = st.find(2); //在set中查找2,返回其迭代器
    printf("%d\n", *it);
    //以上兩句也可以直接寫成printf("%d\n", *(st.find(2)));
    return 0;
}

**(3) erase() **

//erase()有兩種用法:刪除單個元素,刪除一個區間內的所有元素
// 1. 刪除單個元素
//刪除單個元素的方法有兩種
//st.erase(it), it為所需要刪除元素的迭代器。時間復雜度為O(1)
#include <stdio.h>
#include <set>
using namespace std;
int main() {
    set<int> st;
    st.insert(100);
    st.insert(200);
    st.insert(100);
    st.insert(300);
    st.erase(st.find(100));//利用find()函數找到100,然后用erase刪除它
    st.erase(st.find(200));
    for(set<int>::iterator it = st.begin(); it != st.end(); it++) {
        printf("%d\n", *it);
    }
    return 0;
}

//st.erase(value), value為所需要刪除元素的值。時間復雜度為O(logN)
#include <stdio.h>
#include <set>
using namespace std;
int main() {
    set<int> st;
    st.insert(100);
    st.insert(200);
    st.erase(100);  //刪除set中值為100的元素
    for(set<int>::iterator it = st.begin(); it != st.end(); it++) {
        printf("%d\n", *it);    //只輸出200
    }
    return 0;
}


// 2.刪除一個區間內的所有元素
//st.erase(first, last)可以刪除一個區間內的所有元素
//first為所需要刪除區間的起始迭代器,last則為所需要刪除區間的末尾迭代器的下一地址
//即刪除[first, last), 時間復雜度為O(last - first)
#include <stdio.h>
#include <set>
using namespace std;
int main() {
    set<int> st;
    st.insert(20);
    st.insert(10);
    st.insert(40);
    st.insert(30);
    set<int>::iterator it = st.find(30);
    st.erase(it, st.end()); //刪除元素30至set末尾之間的元素,即30和40
    for(it = st.begin(); it != st.end(); it++) {
        printf("%d ", *it); //輸出10 20
    }
    return 0;
}

**(4) size() **

//size()用來獲得set內元素的個數,時間復雜度為O(1)
#include <stdio.h>
#include <set>
using namespace std;
int main() {
    set<int> st;
    st.insert(2);
    st.insert(5);
    st.insert(4);
    printf("%d\n", st.size());  //輸出set內元素的個數
    return 0;
}

**(5) clear() **

//clear()用來清空set中的所有元素,復雜度為O(N)
#include <stdio.h>
#include <set>
using namespace std;
int main() {
    set<int> st;
    st.insert(2);
    st.insert(5);
    st.insert(4);
    st.clear(); //清空set
    printf("%d\n", st.size());
    return 0;
}

3. set的常見用途

  • set最主要的作用時自動去重並按升序排序


免責聲明!

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



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