c++中如何使用set存储不重复元素_c++ set存储方法

set是C++ STL中基于红黑树实现的关联容器,1. 元素自动排序且唯一;2. 支持插入、删除、查找O(log n)时间复杂度;3. 不支持下标访问;4. 可自定义排序规则;5. 常用操作包括insert、find、erase和遍历。

c++中如何使用set存储不重复元素_c++ set存储方法

在C++中,set 是标准模板库(STL)中的一个关联容器,用于存储唯一且自动排序的元素。它能确保插入的元素不会重复,非常适合需要去重并保持有序的场景。

set的基本特性

set 内部基于红黑树实现,具有以下特点:

元素自动排序(默认升序) 不允许重复元素 插入、删除、查找的时间复杂度为 O(log n) 不支持通过下标访问元素

如何声明和初始化set

使用前需包含头文件:

常见声明方式如下:

立即学习“C++免费学习笔记(深入)”;

#include #include std::set intSet;           // 存储整数std::set strSet;   // 存储字符串// 初始化时插入元素(C++11起支持)std::set numbers = {5, 2, 8, 2, 1}; // 重复的2只会保留一个

插入元素

使用 insert() 方法添加元素,set会自动忽略重复值。

intSet.insert(10);intSet.insert(20);intSet.insert(10); // 重复,不会插入// insert 返回 pairauto result = intSet.insert(30);if (result.second) {    std::cout << "插入成功n";} else {    std::cout << "元素已存在n";}

遍历set

使用迭代器或范围for循环访问所有元素:

// 使用范围for(推荐)for (const auto& val : intSet) {    std::cout << val << " ";}// 使用迭代器for (auto it = intSet.begin(); it != intSet.end(); ++it) {    std::cout << *it << " ";}

查找与删除元素

find() 用于查找,返回迭代器;erase() 删除指定元素。

if (intSet.find(10) != intSet.end()) {    std::cout << "找到元素10n";}intSet.erase(20); // 删除值为20的元素intSet.clear();   // 清空所有元素

自定义排序规则

默认按升序排列,可通过仿函数或lambda改变排序方式(如降序):

std::set<int, std::greater> descSet;descSet.insert(5);descSet.insert(1);descSet.insert(8);// 输出:8 5 1

也可以为自定义类型指定比较逻辑:

struct Person {    std::string name;    int age;};struct ComparePerson {    bool operator()(const Person& a, const Person& b) const {        return a.age < b.age; // 按年龄排序    }};std::set people;

基本上就这些。set适合处理需要自动去重和有序的数据集合,掌握 insert、find、erase 和遍历操作就能满足大多数使用需求。注意不要尝试用下标访问,也不建议频繁插入大量数据追求性能的场景。不复杂但容易忽略细节。

以上就是c++++中如何使用set存储不重复元素_c++ set存储方法的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1477671.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 02:14:14
下一篇 2025年12月19日 02:14:24

相关推荐

  • c++中如何解包tuple_c++ tuple解包实现方式

    C++中解包std::tuple可通过结构化绑定(C++17)、std::tie(C++11)或std::get实现,推荐使用结构化绑定,语法简洁且类型自动推导,适用于函数返回多值等场景。 在C++中,解包std::tuple通常是指将元组中的各个元素提取到独立的变量中。虽然C++不像Python那…

    2025年12月19日
    000
  • C++如何获取文件大小_C++ 文件大小获取方法

    c++kquote>C++中获取文件大小的方法包括:①使用C++17的std::filesystem::file_size,简洁且跨平台;②通过fstream的seekg和tellg,兼容老版本C++;③POSIX系统的stat函数,性能高但限Linux/Unix;④Windows API如G…

    2025年12月19日
    000
  • C++如何实现一个简单的工厂模式_C++ 工厂模式实现方法

    工厂模式通过基类指针和多态实现对象创建解耦,定义抽象产品类Product并由ConcreteProductA和B实现use方法,工厂函数根据类型返回具体产品实例,main函数中调用use输出对应信息,集中管理对象创建,新增产品只需扩展工厂逻辑,需注意虚析构函数和内存管理。 工厂模式是一种创建型设计模…

    2025年12月19日
    000
  • c++中如何计算二叉树叶子节点数量_c++二叉树叶子节点数量统计方法

    答案是递归和层序遍历均可统计二叉树叶子节点:递归法判断节点为空返回0,为叶子返回1,否则递归左右子树;层序遍历用队列逐个检查节点是否为叶子并计数,二者均需判断左右孩子为空且处理空树边界。 在C++中统计二叉树的叶子节点数量,通常采用递归或层序遍历的方法。叶子节点是指没有左子树和右子树的节点(即左右孩…

    2025年12月19日
    000
  • c++中如何判断二叉树是否对称_c++二叉树对称性判断方法

    判断二叉树是否对称需检查左右子树是否镜像。递归法比较根节点值及左子树与右子树的对称性,代码简洁;迭代法用队列逐层对比节点,避免栈溢出。两种方法均有效,递归直观,迭代适合深树。 判断二叉树是否对称,核心是检查其左右子树是否互为镜像。这可以通过递归或迭代的方式实现。 递归方法判断对称 从根节点出发,比较…

    2025年12月19日
    000
  • c++中如何重载函数_c++函数重载方法

    函数重载要求同名函数在相同作用域内具有不同参数列表,可通过参数类型、数量或顺序区分,返回类型可不同但不能仅以此区分。示例中add函数根据整型、浮点、字符串等参数实现多种重载形式。非法重载包括仅返回类型不同或仅形参名不同。使用默认参数时需避免调用歧义,如show(int)与show(int, int=…

    2025年12月19日
    000
  • c++怎么写一个CMakeLists.txt文件_c++ CMakeLists.txt写法

    CMakeLists.txt用于定义项目结构、源文件、编译选项和依赖库。1. 指定最低CMake版本和项目名:cmake_minimum_required(VERSION 3.10),project(MyProject)。2. 设置C++标准:set(CMAKE_CXX_STANDARD 17)。3…

    2025年12月19日
    000
  • c++ map如何插入和查找键值对_c++ map插入与查找方法

    std::map基于红黑树实现,支持自动排序,插入和查找时间复杂度为O(log n)。1. 插入可用insert、下标[]或emplace,其中emplace效率更高;2. 查找推荐使用find或count,避免用下标导致意外插入;3. 示例展示了三种插入与两种查找方法的正确使用场景。 在C++中,…

    2025年12月19日
    000
  • c++中如何读取二进制文件_C++二进制文件读写操作方法

    C++通过fstream类操作二进制文件,需包含头文件。1. 用std::ifstream以std::ios::binary模式读取文件,先检查是否打开成功,再用seekg和tellg获取文件大小,分配缓冲区并用read读取数据。2. 写入时使用std::ofstream以binary模式打开,通过…

    2025年12月19日
    000
  • c++怎么使用auto关键字_C++ auto类型推导关键字使用详解

    auto关键字在C++11中被重新定义为类型推导工具,可让编译器根据初始化表达式自动确定变量类型,简化代码并提升可读性;基本用法需配合初始化值,支持基本类型、指针、引用及与STL容器结合使用,如for循环中的迭代器;还可用于尾置返回类型语法,尤其在模板函数中结合decltype推导复杂返回类型;C+…

    2025年12月19日
    000
  • c++中如何创建匿名命名空间_c++匿名命名空间创建方法

    匿名命名空间用于限制标识符作用域至当前编译单元,避免命名冲突并实现内部链接。其语法为namespace { / 内容 / },可包含变量、函数、类等,如int counter; void increment(); class Helper;,均使其仅在本文件内可见。相比C语言的static,它更灵活…

    2025年12月19日
    000
  • c++怎么写单元测试_c++单元测试方法

    使用Google Test是C++单元测试的主流方法,需安装框架、编写测试用例并集成到构建系统。首先通过包管理器或源码编译安装Google Test,接着为被测函数(如add)编写测试文件,使用TEST宏定义测试用例,并用EXPECT_EQ等断言验证结果。通过CMake配置项目,链接GTest库并启…

    2025年12月19日
    000
  • c++20中的协程(coroutines)怎么用_c++20协程使用方法

    C++20协程通过co_await、co_yield、co_return实现暂停与恢复,用于异步编程和生成器;需定义含promise_type的返回类型,控制初始、最终挂起及返回行为;示例展示整数生成器和异步等待的实现机制。 C++20 引入了协程(Coroutines),它是一种可以暂停和恢复执行…

    2025年12月19日
    000
  • c++中的std::weak_ptr有什么用_c++ std::weak_ptr使用方法

    std::weak_ptr用于解决std::shared_ptr的循环引用问题,它不增加引用计数,可安全检查对象是否存在。通过从shared_ptr创建weak_ptr,并使用lock()方法获取临时shared_ptr来判断对象是否有效,从而避免内存泄漏。 std::weak_ptr 是 C++ …

    2025年12月19日
    000
  • c++怎么用g++编译时链接一个库_c++ g++库链接方法

    使用g++链接外部库需用-L指定库路径,-l指定库名(无需lib前缀和扩展名),同时用-I包含头文件路径;优先链接动态库.so,也可直接提供静态库.a完整路径;确保库命名规范并设置LD_LIBRARY_PATH以防运行时找不到.so文件。 在使用 g++ 编译 C++ 程序时,如果需要调用外部库(如…

    2025年12月19日
    000
  • C++如何判断一个指针是否为空_C++ 指针空判断方法

    使用nullptr判断指针是否为空最安全,推荐替代NULL或0;2. 动态分配后需检查返回指针是否为nullptr以处理分配失败;3. 函数传参时应先判断指针参数是否为空避免解引用空指针。 在C++中判断一个指针是否为空,最直接的方法是将其与nullptr进行比较。空指针表示该指针没有指向任何有效的…

    2025年12月19日
    000
  • c++中如何实现移动构造函数_c++移动构造函数实现方法

    移动构造函数通过右值引用高效转移资源,避免深拷贝。其语法为T(T&&),需将源对象资源接管并置为nullptr,防止重复释放;建议标记noexcept以提升性能。编译器仅在未定义析构或拷贝操作时自动生成移动构造,否则需手动实现。例如Buffer类中,移动构造接管ptr与size,并清…

    2025年12月19日
    000
  • c++ shared_ptr和unique_ptr怎么选择_c++ 智能指针选择方法

    选择std::unique_ptr还是std::shared_ptr取决于是否需要共享所有权。若资源仅由单一方独占使用,优先选用std::unique_ptr,因其无运行时开销且安全高效;若多个对象或模块需共享同一资源,则使用std::shared_ptr,但需注意引用计数带来的性能成本及潜在循环引…

    2025年12月19日
    000
  • c++怎么理解RAII原则_c++ RAII原则解析

    RAII通过对象生命周期管理资源,利用构造函数获取资源、析构函数释放资源,确保异常安全和资源不泄漏。 RAII(Resource Acquisition Is Initialization)即“资源获取即初始化”,是C++中一种重要的编程思想,核心在于通过对象的生命周期来管理资源。它不是语言语法的一…

    2025年12月19日
    000
  • c++怎么实现一个线程池_c++线程池实现方法

    答案:C++线程池通过复用线程执行任务,核心包含任务队列、线程集合、互斥锁、条件变量和运行控制开关。工作线程循环等待任务,任务以std::function封装存入队列,通过enqueue添加任务并通知线程,析构时设置停止标志并等待所有线程完成。需注意异常处理、避免阻塞及禁止在关闭后添加任务。 在C+…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信