C++ set&multiset 容器:迭代器、大小以及删除

C++ set&multiset容器:迭代器、大小以及删除

1. set容器基础

set是C++标准模板库(STL)中的一种关联容器,具有以下特点:

  • 自动排序:元素插入后会自动按升序排列
  • 唯一性:每个元素的值必须唯一(multiset允许重复)
  • 基于红黑树:底层通常用红黑树实现,保证高效查找(O(log n))

2. 基本操作

2.1 包含头文件与声明

#include <set>  // 必须包含set头文件
using namespace std;

set<int> setInt;  // 声明一个存储int类型的set

2.2 插入元素

使用insert()方法插入元素:

setInt.insert(5);  // 插入元素5
setInt.insert(9);  // 插入元素9
// 元素将自动排序:1, 3, 5, 7, 9

2.3 遍历set

使用迭代器遍历set:

for (set<int>::iterator it = setInt.begin(); it != setInt.end(); ++it) {
    cout << *it << " ";  // 输出:1 3 5 7 9
}

3. 常用成员函数

3.1 容量相关

  • size(): 返回元素个数
    setInt.size();  // 返回当前元素数量
    
  • empty(): 判断是否为空
    setInt.empty();  // 为空返回true,否则false
    

3.2 迭代器相关

  • begin()/end(): 返回指向首元素/尾后位置的迭代器
  • rbegin()/rend(): 返回反向迭代器
    // 反向遍历
    for (auto rit = setInt.rbegin(); rit != setInt.rend(); ++rit) {
        cout << *rit << " ";  // 输出:9 7 5 3 1
    }
    

4. 元素删除操作

set提供了多种删除方式,需要特别注意迭代器失效问题。

4.1 删除指定位置的元素

setInt.erase(setInt.begin());  // 删除第一个元素

4.2 删除指定范围的元素

auto itBegin = setInt.begin();
auto itEnd = setInt.begin();
advance(itEnd, 3);  // 移动迭代器到第4个元素
setInt.erase(itBegin, itEnd);  // 删除前3个元素

4.3 删除指定值的元素

setInt.erase(7);  // 删除值为7的元素

4.4 清空整个set

setInt.clear();  // 删除所有元素

5. 重要注意事项

  1. 迭代器失效:在循环中删除元素时,erase()会返回下一个有效的迭代器:

    for (auto it = setInt.begin(); it != setInt.end(); /* 不在这里++ */) {
        if (condition) {
            it = setInt.erase(it);  // 正确方式
        } else {
            ++it;
        }
    }
    
  2. 无resize()方法setmultiset没有resize()方法,因为它们的容量是动态管理的。

  3. 性能考虑:由于基于红黑树实现,插入、删除和查找操作的时间复杂度都是O(log n)。

6. 总结

set容器是C++中非常有用的有序集合容器,通过本文我们学习了:

  • 如何insert()元素并自动排序
  • 使用迭代器遍历set
  • 各种erase()删除操作的区别
  • 容量查询方法size()empty()
  • 在循环中安全删除元素的技巧

掌握这些知识点对于高效使用STL容器至关重要,建议通过实际编码练习加深理解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值