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 容器丰富的操作功能,能满足各种涉及有序且唯一元素集合处理的编程需求。

1442

被折叠的 条评论
为什么被折叠?



