在 C++ 中使用 STL Set Container
Jinku Hu
2023年10月12日
-
使用
std::set
在 C++ 中宣告設定容器物件 -
在 C++ 中使用
insert
成員函式將元素插入到集合中 -
使用
find
成員函式在 C++ 中檢索具有給定鍵的元素的迭代器 -
在 C++ 中使用
contains
成員函式檢查具有給定鍵的元素是否存在於集合中
本文將演示有關如何在 C++ 中使用 STL set
容器的多種方法。
使用 std::set
在 C++ 中宣告設定容器物件
std::set
命令將一組排序的唯一物件實現為關聯容器。預設情況下,元素使用 std::less
比較函式排序,但使用者可以提供自定義函式作為第二個模板引數。相同的標頭還提供了 std::multiset
容器,它可以儲存多個值而不過濾重複項。
請注意,我們在以下示例中使用初始化列表建構函式建立了兩個集合物件。我們還利用了 count
成員函式,它檢索具有給定鍵的集合中存在的元素數量。這個函式對於 std::multiset
容器來說更內在,但是當從 std::multiset
物件呼叫時,你可以檢查元素是否存在相同的函式。
#include <iostream>
#include <set>
using std::cout;
using std::endl;
using std::multiset;
using std::set;
template <typename T>
void printSet(set<T> s) {
for (const auto &item : s) {
cout << item << "; ";
}
cout << endl;
}
template <typename T>
void printMultiSet(multiset<T> s) {
for (const auto &item : s) {
cout << item << "; ";
}
cout << endl;
}
#define STR(num) #num
int main() {
std::set<int> s1 = {1, 1, 1, 2, 2, 3};
printSet(s1);
std::multiset<int> s2 = {1, 1, 1, 2, 2, 3};
printMultiSet(s2);
std::cout << STR(s2) << " contains " << s2.count(1) << "ones" << endl;
std::cout << STR(s2) << " contains " << s2.count(2) << "twos" << endl;
return EXIT_SUCCESS;
}
輸出:
1; 2; 3;
1; 1; 1; 2; 2; 3;
s2 contains 3 ones
s2 contains 2 twos
在 C++ 中使用 insert
成員函式將元素插入到集合中
insert
函式有多個過載,但我們使用帶有單個引數的版本,表示要新增到集合中的元素。insert
的過載返回迭代器的 std::pair
物件和 bool
。
後者表示插入是否成功,如果成功,它有一個 true
值。另一方面,當操作成功時,迭代器指向插入的元素。如果失敗,則指向阻止插入的元素。請注意,插入操作在容器的大小上具有對數複雜度。
#include <cassert>
#include <iostream>
#include <set>
using std::cout;
using std::endl;
using std::multiset;
using std::set;
int main() {
std::set<int> s1 = {1, 1, 1, 2, 2, 3};
auto ret = s1.insert(5);
assert(*ret.first == 5);
if (ret.second) std::cout << "Inserted!" << endl;
ret = s1.insert(1);
assert(*ret.first == 1);
if (!ret.second) std::cout << "Not inserted!" << endl;
return EXIT_SUCCESS;
}
輸出:
Inserted!
Not inserted!
使用 find
成員函式在 C++ 中檢索具有給定鍵的元素的迭代器
find
函式是 std::set
容器的另一個有用的成員函式,它可以將迭代器返回到具有給定鍵的元素。如果集合中沒有這樣的元素,則返回尾後迭代器;這有助於使用者驗證成功的函式呼叫。
#include <iostream>
#include <set>
using std::cout;
using std::endl;
using std::multiset;
using std::set;
int main() {
std::set<int> s1 = {1, 1, 1, 2, 2, 3};
auto search = s1.find(2);
if (search != s1.end()) {
cout << "Found " << (*search) << endl;
} else {
cout << "Not found" << endl;
}
return EXIT_SUCCESS;
}
輸出:
Found 2
在 C++ 中使用 contains
成員函式檢查具有給定鍵的元素是否存在於集合中
由於 C++20 語言標準,std::set
提供了成員函式 contains
,這是檢查具有給定鍵的元素是否存在於 set 物件中的更簡單的介面。該函式返回布林值以指示集合中是否存在此類元素。這個函式的執行時間複雜度也是容器大小的對數。
#include <iostream>
#include <set>
using std::cout;
using std::endl;
using std::multiset;
using std::set;
int main() {
std::set<int> s3 = {91, 123, 63, 122, 22, 53};
for (int x : {22, 23, 53, 54}) {
if (s3.contains(x)) {
cout << x << ": Found\n";
} else {
cout << x << ": Not found\n";
}
}
return EXIT_SUCCESS;
}
輸出:
22: Found
23: Not found
53: Found
54: Not found
作者: Jinku Hu