在 C++ 中,集合通常指的是標準模板庫(STL)中的 std::set
或 std::unordered_set
。這兩個都是用來存儲不重復元素的容器,但在實現和使用方式上有一些區別。
1.?std::set
:
- 基于紅黑樹實現,元素按照嚴格的順序(默認是升序)排列。
- 插入、查找、刪除操作的平均時間復雜度為 O(log n)。
- 不支持直接修改元素的值,但可以通過刪除再插入的方式來實現。
- 用法示例:
#include <iostream>
#include <set>int main() {std::set<int> mySet;// 插入元素mySet.insert(3);mySet.insert(1);mySet.insert(4);mySet.insert(2);// 查找元素if (mySet.find(3) != mySet.end()) {std::cout << "3 存在于集合中" << std::endl;}// 刪除元素mySet.erase(4);// 遍歷集合for (int x : mySet) {std::cout << x << " ";}std::cout << std::endl;return 0;
}
2.?std::unordered_set
:
- 基于哈希表實現,元素無序存儲。
- 插入、查找、刪除操作的平均時間復雜度為 O(1)。
- 元素類型必須支持哈希函數,或者提供自定義的哈希函數。
- 用法示例:
#include <iostream> #include <unordered_set>int main() {std::unordered_set<int> mySet;// 插入元素mySet.insert(3);mySet.insert(1);mySet.insert(4);mySet.insert(2);// 查找元素if (mySet.find(3) != mySet.end()) {std::cout << "3 存在于集合中" << std::endl;}// 刪除元素mySet.erase(4);// 遍歷集合for (int x : mySet) {std::cout << x << " ";}std::cout << std::endl;return 0; }
無論使用
std::set
還是std::unordered_set
,都需要包含<set>
或<unordered_set>
頭文件,并且在編譯時鏈接 STL 庫。這些集合提供了強大的功能,可以方便地實現很多常見的數據結構和算法。
3.要判斷一個元素是否在集合中
,你可以使用集合的 find()
函數。這個函數會返回一個迭代器,如果找到了元素,則返回指向該元素的迭代器;如果未找到,則返回集合的 end()
迭代器。下面是一個示例:
#include <iostream>
#include <set>int main() {std::set<int> mySet = {1, 2, 3, 4, 5};int element = 3;// 使用find()函數判斷元素是否在集合中auto it = mySet.find(element);if (it != mySet.end()) {std::cout << element << " 存在于集合中" << std::endl;} else {std::cout << element << " 不在集合中" << std::endl;}return 0;
}
ps:
對于 std::set
中的 end()
,它返回的是指向集合中最后一個元素之后的位置。通常在使用 find()
函數查找元素時,如果找不到目標元素,find()
函數會返回 end()
指向的位置,表示找不到目標元素。因此,我們通常會將 find()
函數的返回值與 end()
迭代器進行比較,以判斷是否找到了目標元素。