set(c++)

在C++中,set 是一个标准库容器,属于 std 命名空间,通常用于存储唯一的元素,并自动按照升序或自定义的顺序排序。它的底层实现通常基于红黑树(或类似的平衡二叉树)。set 中的元素是唯一的,并且不允许修改(即元素不可重复插入和修改)。以下是常用的 set 方法及其详细解释:

1. insert()

insert() 用于向 set 中插入元素。如果元素已经存在,insert() 不会插入新元素,并且返回一个指示插入结果的对(iterator, bool)。

1
2
3
4
std::set<int> mySet;
mySet.insert(10);
mySet.insert(20);
mySet.insert(10); // 插入失败,因为 10 已经存在

2. erase()

erase() 用于删除一个指定的元素。它可以接受一个元素值或一个迭代器作为参数。

  • 通过元素删除:删除指定的元素。
  • 通过迭代器删除:删除指定位置的元素。
1
2
3
4
std::set<int> mySet = {10, 20, 30};
mySet.erase(20); // 删除元素 20
auto it = mySet.find(10);
mySet.erase(it); // 删除元素 10

3. find()

find() 用于查找 set 中是否包含某个元素。返回一个指向该元素的迭代器,如果找不到则返回 set::end()

1
2
3
4
5
6
7
std::set<int> mySet = {10, 20, 30};
auto it = mySet.find(20); // 返回指向 20 的迭代器
if (it != mySet.end()) {
// 找到了
} else {
// 未找到
}

4. count()

count() 返回指定元素在 set 中的出现次数。由于 set 中的元素唯一,因此返回值只能是 0 或 1。

1
2
3
std::set<int> mySet = {10, 20, 30};
int count = mySet.count(20); // count 为 1,因为 20 存在
count = mySet.count(40); // count 为 0,因为 40 不存在

5. empty()

empty() 用于检查 set 是否为空。如果为空,返回 true;否则返回 false

1
2
3
4
std::set<int> mySet;
if (mySet.empty()) {
std::cout << "Set is empty." << std::endl;
}

6. size()

size() 返回 set 中的元素个数。

1
2
std::set<int> mySet = {10, 20, 30};
std::cout << "Size: " << mySet.size() << std::endl; // 输出 3

7. clear()

clear() 清空 set 中的所有元素。

1
2
std::set<int> mySet = {10, 20, 30};
mySet.clear(); // 清空所有元素

8. lower_bound()upper_bound()c++

  • lower_bound() 返回指向第一个不小于给定值的元素的迭代器。
  • upper_bound() 返回指向第一个大于给定值的元素的迭代器。

这两个方法常用于区间查找。

1
2
3
std::set<int> mySet = {10, 20, 30, 40};
auto lb = mySet.lower_bound(25); // 返回指向 30 的迭代器
auto ub = mySet.upper_bound(25); // 返回指向 30 的迭代器

9. reverse_iteratorrbegin(), rend()

set 支持反向迭代器,可以通过 rbegin()rend() 来获取反向迭代器,便于逆序遍历。

1
2
3
4
std::set<int> mySet = {10, 20, 30};
for (auto it = mySet.rbegin(); it != mySet.rend(); ++it) {
std::cout << *it << " "; // 输出 30 20 10
}

10. swap()

swap() 用于交换两个 set 容器的内容。

1
2
3
std::set<int> set1 = {10, 20, 30};
std::set<int> set2 = {40, 50, 60};
set1.swap(set2); // set1 变为 {40, 50, 60},set2 变为 {10, 20, 30}

11. equal_range()

equal_range() 返回一个包含两个迭代器的对,第一个是指向第一个不小于给定值的元素,第二个是指向第一个大于给定值的元素。

1
2
3
std::set<int> mySet = {10, 20, 30, 40};
auto range = mySet.equal_range(20);
std::cout << "Lower: " << *range.first << ", Upper: " << *range.second << std::endl;

12. begin()end()

  • begin() 返回指向 set 中第一个元素的迭代器。
  • end() 返回指向 set 末尾元素的迭代器,指向的是一个虚拟元素,比最后一个元素的后一个位置。
1
2
3
4
std::set<int> mySet = {10, 20, 30};
for (auto it = mySet.begin(); it != mySet.end(); ++it) {
std::cout << *it << " "; // 输出 10 20 30
}

总结

set 是一个非常强大的容器,提供了自动排序、唯一性保证和高效的查找、插入、删除操作。使用这些方法,能够高效地管理和操作一组有序的元素。