C++set的常用接口

1. 构造函数

  • 默认构造函数:创建一个空的 set 容器。
std::set<int> mySet;  // 创建一个空的存储int类型元素的set
  • 范围构造函数:可以使用另一个容器(需支持迭代器遍历,如 vectorarray 等)中指定范围的元素来初始化 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 容器丰富的操作功能,能满足各种涉及有序且唯一元素集合处理的编程需求。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值