《算法筆記》學習筆記
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最主要的作用時自動去重並按升序排序