在C++標準庫中,set
?和?multiset
?是兩種非常有用的關聯容器,它們包含唯一元素(對于set
)或可重復元素(對于multiset
),并且默認情況下這些元素都是自動排序的。它們通過鍵(即存儲的元素本身)來存儲和檢索元素,因此這些容器中的元素都是唯一的(對于set
)或者可以有重復的(對于multiset
)。
以下是set
和multiset
的一些基本用法:
引入頭文件
#include <set>
#include <iostream>
聲明和初始化
// 聲明set,自動對int類型元素排序
std::set<int> s; // 聲明multiset,允許int類型元素重復
std::multiset<int> ms; // 初始化
std::set<int> s = {1, 2, 3, 4, 5};
std::multiset<int> ms = {1, 2, 2, 3, 3, 3};
插入元素
s.insert(6);
ms.insert(4);
ms.insert(4); // 在multiset中,可以插入重復元素
查找元素
if (s.find(3) != s.end()) { std::cout << "3 is in the set.\n";
} // 對于multiset,可以使用count方法來查找元素的數量
size_t count_of_3 = ms.count(3);
std::cout << "There are " << count_of_3 << " 3s in the multiset.\n";
遍歷元素
for (const auto& elem : s) { std::cout << elem << " ";
}
std::cout << '\n'; for (const auto& elem : ms) { std::cout << elem << " ";
}
std::cout << '\n';
刪除元素
s.erase(3); // 刪除set中的元素3(如果存在)
ms.erase(4); // 刪除multiset中所有值為4的元素 // 也可以通過迭代器刪除元素
auto it = ms.find(2);
if (it != ms.end()) { ms.erase(it); // 刪除迭代器指向的元素
}
其他操作
size()
:返回容器中元素的數量。empty()
:如果容器為空,則返回true
。clear()
:刪除容器中的所有元素。lower_bound(key)
?和?upper_bound(key)
:返回指向不小于(大于)給定鍵的第一個元素的迭代器。這兩個函數對于實現范圍查找特別有用。- 這里詳細聲明 lower_bound(key) 和 upper_bound(key)
lower_bound(key)
lower_bound(key)
函數返回一個迭代器,指向第一個不小于(即大于或等于)key
的元素。如果key
不在容器中,則返回指向容器中第一個大于key
的位置的迭代器,如果容器中沒有任何元素大于key
,則返回end()
迭代器
upper_bound(key)
upper_bound(key)
函數返回一個迭代器,指向第一個大于key
的元素。如果key
不在容器中,或者key
是容器中的最后一個元素,則返回end()
迭代器。
示例:
假設我們有一個multiset<int>
容器ms
,包含以下元素:1 2 2 3 4 4 4 5
。
std::multiset<int> ms = {1, 2, 2, 3, 4, 4, 4, 5}; auto lb = ms.lower_bound(3); // lb指向第一個不小于3的元素,即3
auto ub = ms.upper_bound(3); // ub指向第一個大于3的元素,即4 // 遍歷[lb, ub)范圍內的元素
for (auto it = lb; it != ub; ++it) { std::cout << *it << ' '; // 輸出:3
} lb = ms.lower_bound(4); // lb指向第一個不小于4的元素,即4
ub = ms.upper_bound(4); // ub指向第一個大于4的元素,即5 // 遍歷[lb, ub)范圍內的元素
for (auto it = lb; it != ub; ++it) { std::cout << *it << ' '; // 輸出:4 4 4
}
- 這兩個函數通常用于在有序容器中實現范圍查找,特別適用于需要查找一個鍵的多個相同值的情況(如在
multiset
中)。 - 由于
set
和multiset
是自動排序的,所以這些操作的時間復雜度都是對數級別的。
請注意,set
和multiset
的迭代器是穩定的,這意味著在插入或刪除元素時,不會使指向其他元素的迭代器失效(除了指向被刪除元素的迭代器)。