set容器的多方面探索

一、set容器介绍

Set是C++ STL的一种关联式容器,它类似于一个集合,其中不可以出现相同的元素,同时元素是按照一定顺序排列的。

Set容器是通过对元素进行排序和去重来实现这些特性的,因此在使用时需要注意元素的比较和去重规则。

Set的内部实现是红黑树,因此插入、删除和查找元素操作都具有较好的时间复杂度,常数级别的低。

二、set容器的基本操作

对于Set容器,最基本的操作包括插入元素、删除元素和查找元素。下面是对这三个操作的介绍:

1. 插入元素


#include <set>
#include <iostream>

int main() {
    std::set s;
    s.insert(3);
    s.insert(1);
    s.insert(4);
    s.insert(1);
    for (auto it = s.begin(); it != s.end(); it++) {
        std::cout << *it << " ";
    }
    return 0;
}

输出结果为:1 3 4。

从结果可以看到,1并没有被重复插入,这是因为Set容器的特性,它会自动去重。

2. 删除元素


#include <set>
#include <iostream>

int main() {
    std::set s;
    s.insert(3);
    s.insert(1);
    s.insert(4);
    s.erase(1);
    for (auto it = s.begin(); it != s.end(); it++) {
        std::cout << *it << " ";
    }
    return 0;
}

输出结果为:3 4。

从结果可以看到,我们通过erase函数删除了Set容器中的一个元素1,Set容器的自动去重特性也保证了删除操作的正确性。

3. 查找元素


#include <set>
#include <iostream>

int main() {
    std::set s;
    s.insert(3);
    s.insert(1);
    s.insert(4);
    auto it = s.find(3);
    if (it != s.end()) {
        std::cout << "Found " << *it << std::endl;
    } else {
        std::cout << "Not Found" << std::endl;
    }
    return 0;
}

输出结果为:Found 3。

从结果可以看到,我们通过find函数在Set容器中查找了元素3,并输出了查找结果。

三、set容器的排序规则

Set容器的特性使得其中的元素按照一定规则排序,常见的排序规则包括从小到大排序和从大到小排序。

在C++ STL的Set容器中,默认的排序规则是从小到大排序,即元素类型的小于号(<)被定义为元素的比较运算符。如果需要修改Set容器的排序规则,可以通过自定义比较函数来实现。

1. 从小到大排序


#include <set>
#include <iostream>

struct Student {
    std::string name;
    int age;

    bool operator<(const Student& other) const {
        return name < other.name;
    }
};

int main() {
    std::set s;
    s.insert({"Tom", 18});
    s.insert({"Alice", 20});
    s.insert({"Bob", 19});
    for (auto& it : s) {
        std::cout << it.name << " " << it.age << std::endl;
    }
    return 0;
}

输出结果为:Alice 20
Bob 19
Tom 18

从结果可以看出,这里我们自定义了Student结构体的小于号比较运算符为按照姓名从小到大排序,因此Set容器中的元素被按照这个规则排序了。

2. 从大到小排序


#include <set>
#include <iostream>

struct Student {
    std::string name;
    int age;

    bool operator other.name;
    }
};

int main() {
    std::set s;
    s.insert({"Tom", 18});
    s.insert({"Alice", 20});
    s.insert({"Bob", 19});
    for (auto& it : s) {
        std::cout << it.name << " " << it.age << std::endl;
    }
    return 0;
}

输出结果为:Tom 18
Bob 19
Alice 20

从结果可以看出,这里我们同样自定义了Student结构体的小于号比较运算符,不同的是按照姓名从大到小排序。这个比较函数和从小到大排序的比较函数仅仅是在小于号的返回值上取反了而已。

四、set容器的应用场景

Set容器作为一个可以去重排序的容器,在实际开发中有许多应用场景,下面介绍其中的两个常见的应用场景。

1. 统计单词数目


#include <set>
#include <iostream>
#include <sstream>

int main() {
    std::string str = "apple banana apple orange banana";
    std::istringstream iss(str);
    std::set s;
    std::string word;
    while (iss >> word) {
        s.insert(word);
    }
    std::cout << s.size() << std::endl;
    return 0;
}

输出结果为:3。

这里我们利用了Set容器的自动去重特性来统计字符串中单词数目。将字符串中的单词插入到Set容器中,这样Set容器中的元素就是不重复的单词,Set容器的size()函数就可以得到单词数目了。

2. 求两个数组的交集


#include <set>
#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector v1 = {1, 3, 5, 7, 9};
    std::vector v2 = {2, 3, 5, 7, 8};
    std::set s1(v1.begin(), v1.end());
    std::set s2(v2.begin(), v2.end());
    std::vector v3;
    std::set_intersection(s1.begin(), s1.end(), s2.begin(), s2.end(), std::back_inserter(v3));
    for (auto& it : v3) {
        std::cout << it << " ";
    }
    return 0;
}

输出结果为:3 5 7。

这里我们利用了Set容器的自动去重和排序特性,将两个数组分别转换为Set容器,这样两个Set容器的交集就是两个数组的交集,利用STL的set_intersection算法,便可以得到两个数组的交集。

总结

本文对Set容器进行了一系列的介绍和讲解,从基本操作到排序规则再到实际应用场景,都有详细的阐述。Set容器是C++ STL中十分常用且实用的容器,掌握Set容器的使用方法和特性对于编程开发人员来说是很重要的。

原创文章,作者:MFNTA,如若转载,请注明出处:https://www.506064.com/n/332768.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
MFNTAMFNTA
上一篇 2025-01-27 13:34
下一篇 2025-01-27 13:34

相关推荐

  • Python中set函数的作用

    Python中set函数是一个有用的数据类型,可以被用于许多编程场景中。在这篇文章中,我们将学习Python中set函数的多个方面,从而深入了解这个函数在Python中的用途。 一…

    编程 2025-04-29
  • Python Set元素用法介绍

    Set是Python编程语言中拥有一系列独特属性及特点的数据类型之一。它可以存储无序且唯一的数据元素,这使得Set在数据处理中非常有用。Set能够进行交、并、差集等操作,也可以用于…

    编程 2025-04-29
  • 解决docker-compose 容器时间和服务器时间不同步问题

    docker-compose是一种工具,能够让您使用YAML文件来定义和运行多个容器。然而,有时候容器的时间与服务器时间不同步,导致一些不必要的错误和麻烦。以下是解决方法的详细介绍…

    编程 2025-04-29
  • Python set去重保留原顺序

    当一个列表中出现重复的元素时,为了去除这些重复元素可以使用Python提供的集合(set)数据结构,集合可以去除元素的重复出现。然而,这样会导致原有的元素顺序混乱,这时,需要使用一…

    编程 2025-04-27
  • Python数据容器切片

    本文将从多个方面详细阐述Python数据容器切片的应用、技巧和方法。 一、切片的基本操作 Python的数据容器包括字符串、列表、元组、字典等,而切片是对这些容器进行子序列提取的常…

    编程 2025-04-27
  • Python取较大值的多方面

    Python是一款流行的编程语言,广泛应用于数据分析、科学计算、Web开发等领域。作为一名全能开发工程师,了解Python的取较大值方法非常必要。本文将从多个方面对Python取较…

    编程 2025-04-27
  • Docker批量删除容器详解

    一、前言 Docker是一个开源的应用容器引擎,提供了一种轻量级容器化技术,方便快捷的进行应用打包、发布、运行。作为广泛应用的技术之一,Docker是开发、测试、运维的得力助手。但…

    编程 2025-04-25
  • Java Tomcat:Web应用程序的完美容器

    一、浅谈Tomcat Tomcat,全称为Apache Tomcat,是一个免费的、开源的Java Servlet容器,而Java Servlet是一种服务器端的Java扩展程序,…

    编程 2025-04-25
  • Java 数组转 Set

    一、Set 和数组的概念 在 Java 中,Set 是一种不允许重复元素的 Collection 集合。和 List 不同,Set 不保证元素的顺序。而数组是一种特殊的数据结构,它…

    编程 2025-04-25
  • Python中的set.count

    一、概述 在Python中,set是一种无序、可变的集合类型。set.count方法用于统计set中某个元素出现的次数。它接受一个参数,即要统计出现次数的元素。如果参数元素不在se…

    编程 2025-04-25

发表回复

登录后才能评论