1. 构造函数
- 默认构造函数:创建一个空的
set
容器。
std::set<int> mySet; // 创建一个空的存储int类型元素的set
- 范围构造函数:可以使用另一个容器(需支持迭代器遍历,如
vector
、array
等)中指定范围的元素来初始化set
。例如,使用vector
的部分元素初始化set
:
std::vector<int> numbers = {5, 3, 7, 3, 9, 5};
std::set<int> mySet(numbers.begin(), numbers.end());
// 此时mySet中包含numbers里去重且排序后的元素,即{3, 5, 7, 9}
- 拷贝构造函数:用已有的一个
set
来创建新的与之完全相同(元素及顺序都相同)的set
。
std::set<int> set1 = {1, 2, 3};
std::set<int> set2(set1); // set2与set1内容一样,都是{1, 2, 3}
- 初始化列表构造函数:在声明时直接通过花括号内的元素列表来初始化
set
。
std::set<int> mySet = {4, 2, 6}; // 初始化后的mySet为{2, 4, 6},自动排序
2. insert
(插入元素)
- 插入单个元素:
向set
中插入一个新元素,如果该元素在set
中不存在,则插入成功;若已存在(因为set
元素具有唯一性),则插入操作被忽略。
std::set<int> mySet;
mySet.insert(5);
mySet.insert(3);
// 此时mySet为{3, 5},若再次插入5,set内元素不变
- 批量插入元素(通过迭代器范围):
从另一个容器(或同一个容器的不同范围)获取元素并插入到当前set
中。
std::set<int> set1 = {1, 2};
std::set<int> set2 = {3, 4};
set1.insert(set2.begin(), set2.end());
// 现在set1变为{1, 2, 3, 4}
3. erase
(删除元素)
- 通过元素值删除:
指定要删除元素的值,将该元素从set
中移除,如果元素不存在则什么也不做。
std::set<int> mySet = {1, 2, 3};
mySet.erase(2);
// 此时mySet变为{1, 3}
- 通过迭代器删除:
先找到要删除元素对应的迭代器,再使用该迭代器进行删除操作。需要注意的是,删除后该迭代器会失效,若后续还需使用迭代器操作,要谨慎处理(可利用erase
返回新的有效迭代器的特性)。
std::set<int> mySet = {1, 2, 3, 4, 5};
auto start = mySet.find(2);
auto end = mySet.find(4);
mySet.erase(start, end);
// 此时mySet变为{1, 4, 5}
4. find
(查找元素)
用于查找指定元素是否存在于 set
中,返回一个迭代器指向被查找的元素;若元素不存在,则返回指向 set
末尾(即 end()
所表示的位置)的迭代器。
std::set<int> mySet = {1, 2, 3};
auto it = mySet.find(2);
if (it!= mySet.end()) {
std::cout << "元素 2 存在于 set 中" << std::endl;
} else {
std::cout << "元素 2 不存在于 set 中" << std::endl;
}
5. count
(统计元素出现次数)
由于 set
中元素具有唯一性,所以元素要么存在(出现 1 次),要么不存在(出现 0 次),该函数返回值通常是 0 或 1,用于判断元素是否在 set
中。
std::set<int> mySet = {1, 2, 3};
int num = mySet.count(2);
// num 的值为 1,表示元素 2 存在于 set 中
6. lower_bound
(查找下界)
返回一个迭代器,指向 set
中第一个大于等于给定值的元素。常用于查找满足一定条件的元素区间起点等场景。
std::set<int> mySet = {1, 3, 5, 7, 9};
auto it = mySet.lower_bound(5);
// it 指向元素 5
7. upper_bound
(查找上界)
返回一个迭代器,指向 set
中第一个大于给定值的元素。与 lower_bound
配合可用于确定元素所在区间等操作。
std::set<int> mySet = {1, 3, 5, 7, 9};
auto it2 = mySet.upper_bound(5);
// it2 指向元素 7
8. size
(获取元素个数)
返回当前 set
容器中元素的数量。
std::set<int> mySet = {1, 2, 3};
std::cout << "set 中元素个数为: " << mySet.size() << std::endl;
// 输出:set 中元素个数为: 3
9. empty
(判断是否为空)
检查 set
是否为空,为空则返回 true
,否则返回 false
。
std::set<int> mySet;
std::cout << "set 是否为空: " << (mySet.empty()? "是" : "否") << std::endl;
// 输出:set 是否为空: 是
std::set<int> anotherSet = {1};
std::cout << "anotherSet 是否为空: " << (anotherSet.empty()? "是" : "否") << std::endl;
// 输出:anotherSet 是否为空: 否
10. clear
(清空元素)
移除 set
中的所有元素,将其变为一个空的 set
。
std::set<int> mySet = {1, 2, 3};
mySet.clear();
// 此时mySet为空
11. begin
和 end
(迭代器相关)
begin
:返回指向set
中第一个元素的迭代器,用于遍历等操作的起始位置。end
:返回指向set
中最后一个元素之后位置的迭代器,用于判断遍历是否结束,常与begin
配合使用,例如:
std::set<int> mySet = {1, 2, 3};
for (auto it = mySet.begin(); it!= mySet.end(); ++it) {
std::cout << *it << " ";
}
// 输出:1 2 3
12. rbegin
和 rend
(反向迭代器相关)
rbegin
:返回指向set
中最后一个元素的反向迭代器,用于反向遍历的起始位置。rend
:返回指向set
中第一个元素之前位置的反向迭代器,用于判断反向遍历是否结束,可实现从后往前遍历set
,示例如下:
std::set<int> mySet = {1, 2, 3};
for (auto it = mySet.rbegin(); it!= mySet.rend(); ++it) {
std::cout << *it << " ";
}
// 输出:3 2 1
这些接口共同构成了 set
容器丰富的操作功能,能满足各种涉及有序且唯一元素集合处理的编程需求。