C++中集合的使用

在 C++ 中,集合通常指的是标准模板库(STL)中的 std::setstd::unordered_set。这两个都是用来存储不重复元素的容器,但在实现和使用方式上有一些区别。

1. std::set

  • 基于红黑树实现,元素按照严格的顺序(默认是升序)排列。
  • 插入、查找、删除操作的平均时间复杂度为 O(log n)。
  • 不支持直接修改元素的值,但可以通过删除再插入的方式来实现。
  • 用法示例:
#include <iostream>
#include <set>

int main() {
    std::set<int> mySet;

    // 插入元素
    mySet.insert(3);
    mySet.insert(1);
    mySet.insert(4);
    mySet.insert(2);

    // 查找元素
    if (mySet.find(3) != mySet.end()) {
        std::cout << "3 存在于集合中" << std::endl;
    }

    // 删除元素
    mySet.erase(4);

    // 遍历集合
    for (int x : mySet) {
        std::cout << x << " ";
    }
    std::cout << std::endl;

    return 0;
}

2. std::unordered_set

  • 基于哈希表实现,元素无序存储。
  • 插入、查找、删除操作的平均时间复杂度为 O(1)。
  • 元素类型必须支持哈希函数,或者提供自定义的哈希函数。
  • 用法示例:
    #include <iostream>
    #include <unordered_set>
    
    int main() {
        std::unordered_set<int> mySet;
    
        // 插入元素
        mySet.insert(3);
        mySet.insert(1);
        mySet.insert(4);
        mySet.insert(2);
    
        // 查找元素
        if (mySet.find(3) != mySet.end()) {
            std::cout << "3 存在于集合中" << std::endl;
        }
    
        // 删除元素
        mySet.erase(4);
    
        // 遍历集合
        for (int x : mySet) {
            std::cout << x << " ";
        }
        std::cout << std::endl;
    
        return 0;
    }
    

    无论使用 std::set 还是 std::unordered_set,都需要包含 <set><unordered_set> 头文件,并且在编译时链接 STL 库。这些集合提供了强大的功能,可以方便地实现很多常见的数据结构和算法。

3.要判断一个元素是否在集合中

,你可以使用集合的 find() 函数。这个函数会返回一个迭代器,如果找到了元素,则返回指向该元素的迭代器;如果未找到,则返回集合的 end() 迭代器。下面是一个示例:

#include <iostream>
#include <set>

int main() {
    std::set<int> mySet = {1, 2, 3, 4, 5};

    int element = 3;

    // 使用find()函数判断元素是否在集合中
    auto it = mySet.find(element);
    if (it != mySet.end()) {
        std::cout << element << " 存在于集合中" << std::endl;
    } else {
        std::cout << element << " 不在集合中" << std::endl;
    }

    return 0;
}

ps:

对于 std::set 中的 end(),它返回的是指向集合中最后一个元素之后的位置。通常在使用 find() 函数查找元素时,如果找不到目标元素,find() 函数会返回 end() 指向的位置,表示找不到目标元素。因此,我们通常会将 find() 函数的返回值与 end() 迭代器进行比较,以判断是否找到了目标元素。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西柚与蓝莓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值