C++ 学习之Set容器

简介: C++ 学习之Set容器

C++ Set容器构造和赋值

在C++中,std::set是一个用于存储唯一元素的有序集合容器。下面介绍一下std::set容器的构造和赋值操作:

构造 std::set

  1. 默认构造函数
std::set<int> mySet; // 创建一个空的set
  1. 使用初始化列表构造
std::set<int> mySet = {1, 2, 3, 4, 5}; // 创建包含初始值的set
  1. 区间构造函数
std::vector<int> vec = {9, 8, 7};
std::set<int> mySet(vec.begin(), vec.end()); // 使用迭代器范围进行构造

赋值 std::set

  1. 拷贝赋值
std::set<int> set1 = {1, 2, 3};
std::set<int> set2;
set2 = set1; // 将set1的内容拷贝给set2
  1. 移动赋值(C++11引入):
std::set<int> set1 = {1, 2, 3};
std::set<int> set2;
set2 = std::move(set1); // 移动set1的内容给set2,set1变为空
  1. 使用赋值运算符= {}
std::set<int> set1 = {1, 2, 3};
set1 = {4, 5, 6}; // 覆盖原有set1内容,现在set1包含{4, 5, 6}
  1. 使用insert插入新元素
std::set<int> mySet = {1, 2, 3};
mySet.insert(4); // 插入元素4到set中

C++ Set容器大小和交换

在C++中,std::set是一个关联容器,用于存储唯一元素的有序集合。下面介绍一下如何获取set容器的大小和进行交换操作:

获取 set 容器大小

通过 size() 成员函数可以获取set容器中元素的数量,即set的大小。

std::set<int> mySet = {1, 2, 3, 4, 5};
int size = mySet.size();
std::cout << "Set size: " << size << std::endl;

交换 set 容器

使用 swap() 成员函数可以交换两个set容器的内容,实现容器内元素的交换。

std::set<int> set1 = {1, 2, 3};
std::set<int> set2 = {4, 5, 6};
std::cout << "set1 before swap:";
for (int elem : set1) {
    std::cout << elem << " ";
}
std::cout << std::endl;
std::cout << "set2 before swap:";
for (int elem : set2) {
    std::cout << elem << " ";
}
std::cout << std::endl;
set1.swap(set2); // 交换set1和set2的内容
std::cout << "set1 after swap:";
for (int elem : set1) {
    std::cout << elem << " ";
}
std::cout << std::endl;
std::cout << "set2 after swap:";
for (int elem : set2) {
    std::cout << elem << " ";
}
std::cout << std::endl;

通过交换操作,可以方便地管理set容器中的元素。

C++ Set容器插入和删除

在 C++ 中,std::set 是一种关联容器,用于存储唯一元素的有序集合。下面介绍如何在 std::set 容器中进行插入和删除操作:

插入操作

  1. 使用 insert 函数插入单个元素
std::set<int> mySet = {1, 2, 3};
mySet.insert(4); // 向 set 中插入元素 4
  1. 使用 insert 函数插入多个元素
std::set<int> mySet = {1, 2, 3};
mySet.insert({4, 5, 6}); // 向 set 中插入元素 4, 5, 6

删除操作

  1. 使用 erase 函数删除指定元素
std::set<int> mySet = {1, 2, 3, 4};
mySet.erase(3); // 从 set 中删除值为 3 的元素
  1. 使用 erase 函数通过迭代器删除元素:
std::set<int> mySet = {1, 2, 3, 4};
auto it = mySet.find(2);
if (it != mySet.end()) {
    mySet.erase(it); // 通过迭代器 it 删除元素
}
  1. 清空整个 set 容器:
std::set<int> mySet = {1, 2, 3, 4};
mySet.clear(); // 清空 set 中的所有元素

C++ Set容器查找和统计

在 C++ 中,std::set 是一种关联容器,用于存储唯一元素的有序集合。下面介绍如何在 std::set 容器中进行查找和统计操作:

查找元素

  1. 使用 find 函数查找元素
std::set<int> mySet = {1, 2, 3, 4, 5};
auto it = mySet.find(3);
if (it != mySet.end()) {
    std::cout << "元素 3 存在于 set 中" << std::endl;
} else {
    std::cout << "元素 3 不存在于 set 中" << std::endl;
}
  1. 使用 count 函数统计元素个数
std::set<int> mySet = {1, 2, 2, 3, 3, 3};
int count = mySet.count(2);
std::cout << "元素 2 的个数为: " << count << std::endl;

统计元素个数

  1. 遍历并统计元素出现次数
std::set<int> mySet = {1, 2, 2, 3, 3, 3};
std::map<int, int> elementCount;
for (int elem : mySet) {
    elementCount[elem]++;
}
for (const auto& pair : elementCount) {
    std::cout << "元素 " << pair.first << " 出现次数为 " << pair.second << std::endl;
}
  1. 使用 size 函数获取 set 中不同元素的个数:
std::set<int> mySet = {1, 2, 2, 3, 3, 3};
int uniqueElements = mySet.size();
std::cout << "set 中不同元素的个数为:" << uniqueElements << std::endl;

C++ Set容器Set和Multiset区别

在 C++ 中,std::setstd::multiset 都属于关联容器,用于存储有序的元素集合,但它们在元素唯一性方面有所不同。下面介绍一下 std::setstd::multiset 的区别:

std::set

  • 元素唯一性std::set 中每个元素都是唯一的,不能有重复元素。
  • 插入操作:插入重复元素会被忽略。
  • 数据结构std::set 内部基于平衡二叉搜索树(红黑树)实现,保证元素有序性,并保证插入、删除、查找操作的时间复杂度为 O(logn)。
#include <set>
std::set<int> mySet = {1, 2, 3, 2, 4}; // 最终mySet中只包含不重复的元素{1, 2, 3, 4}

std::multiset

  • 元素唯一性std::multiset 允许存储重复元素,即可以插入相同的元素多次。
  • 插入操作:插入操作会直接插入元素,不会判断是否已存在。
  • 数据结构std::multiset 内部同样基于平衡二叉搜索树,但允许重复元素的存在。
#include <set>
std::multiset<int> myMultiSet = {1, 2, 3, 2, 4}; // myMultiSet中允许存储重复元素{1, 2, 2, 3, 4}

可以根据具体需求选择使用 std::setstd::multiset 来存储数据,如果需要确保集合中不包含重复元素,则使用 std::set;如果允许重复元素存在,则使用 std::multiset

C++ Set容器内置类型指定排序规则

在 C++ 的 std::set 容器中,默认情况下元素是按照严格的弱排序规则进行排序。但是,你也可以通过指定自定义的排序准则来对容器中的元素进行排序。下面介绍如何在 std::set 中指定排序规则:

  1. 使用函数对象(Functor)

你可以定义一个函数对象类(也称为Functor),其中包含一个 operator() 成员函数,该函数用于比较两个元素。然后在创建 std::set 对象时,将这个函数对象作为第二个模板参数传递给 std::set

#include <iostream>
#include <set>
struct MyComparator {
    bool operator()(int a, int b) const {
        return a > b; // 降序
    }
};
int main() {
    std::set<int, MyComparator> mySet;
    mySet.insert(3);
    mySet.insert(1);
    mySet.insert(2);
    for (int elem : mySet) {
        std::cout << elem << " "; // 输出结果:3 2 1
    }
    return 0;
}

使用自定义的 MyComparator 函数对象,重载了 operator() 成员函数,使得 std::set 中的元素按降序排列。

  1. 使用 Lambda 表达式

使用 Lambda 表达式也是一种方便的方式来指定 std::set 中的排序规则。

#include <iostream>
#include <set>
int main() {
    auto comparator = [](int a, int b) {
        return a > b;  // 降序
    };
    std::set<int, decltype(comparator)> mySet(comparator);
    mySet.insert(3);
    mySet.insert(1);
    mySet.insert(2);
    for (int elem : mySet) {
        std::cout << elem << " "; // 输出结果:3 2 1
    }
    return 0;
}

使用 lambda 表达式创建了一个自定义的比较函数 comparator,使得 std::set 中的元素按降序排列。

通过自定义排序规则,可以灵活地对 std::set 容器中的元素进行排序。

C++ Set容器自定义数据类型指定排序规则

对于 C++ 中的 std::set 容器,如果你想要在自定义数据类型上指定排序规则,你可以使用类似于在内置类型上指定排序规则的方法。下面我将介绍如何在自定义数据类型上指定排序规则:

假设我们有一个名为 Person 的自定义结构体,其中包含 nameage 两个成员变量。

#include <iostream>
#include <set>
#include <string>
struct Person {
    std::string name;
    int age;
    Person(const std::string& newName, int newAge) : name(newName), age(newAge) {}
    // 自定义比较函数
    struct Compare {
        bool operator() (const Person& a, const Person& b) const {
            return a.age < b.age;  // 按照年龄升序排列
        }
    };
};
int main() {
    // 在创建 set 对象时,指定自定义的比较函数
    std::set<Person, Person::Compare> personSet;
    // 添加一些 Person 对象到 set 中
    personSet.insert(Person("Alice", 25));
    personSet.insert(Person("Bob", 30));
    personSet.insert(Person("Charlie", 20));
    // 遍历输出结果
    for (const auto& person : personSet) {
        std::cout << person.name << " (" << person.age << ") ";
    }
    return 0;
}

在上面的示例中,我们定义了一个结构体 Person,然后在结构体内部定义了一个比较函数对象 Compare,用于指定按照年龄升序排列。在创建 std::set 对象时,我们以该比较函数作为第二个模板参数传入,从而实现了在自定义数据类型 Person 上指定排序规则。

通过类似的方法,你可以定义任意的比较函数对象来指定自定义数据类型在 std::set 容器中的排序规则,以满足你的特定需求。

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

相关文章
|
8天前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
41 16
|
27天前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
46 4
2023/11/10学习记录-C/C++对称分组加密DES
|
2月前
|
存储 C++ 容器
【C++】map、set基本用法
本文介绍了C++ STL中的`map`和`set`两种关联容器。`map`用于存储键值对,每个键唯一;而`set`存储唯一元素,不包含值。两者均基于红黑树实现,支持高效的查找、插入和删除操作。文中详细列举了它们的构造方法、迭代器、容量检查、元素修改等常用接口,并简要对比了`map`与`set`的主要差异。此外,还介绍了允许重复元素的`multiset`和`multimap`。
37 3
【C++】map、set基本用法
|
2月前
|
存储 算法 C++
【C++】unordered_map(set)
C++中的`unordered`容器(如`std::unordered_set`、`std::unordered_map`)基于哈希表实现,提供高效的查找、插入和删除操作。哈希表通过哈希函数将元素映射到特定的“桶”中,每个桶可存储一个或多个元素,以处理哈希冲突。主要组成部分包括哈希表、哈希函数、冲突处理机制、负载因子和再散列,以及迭代器。哈希函数用于计算元素的哈希值,冲突通过开链法解决,负载因子控制哈希表的扩展。迭代器支持遍历容器中的元素。`unordered_map`和`unordered_set`的插入、查找和删除操作在理想情况下时间复杂度为O(1),但在冲突较多时可能退化为O(n)。
29 5
|
2月前
|
存储 C++ 容器
【C++】set模拟实现
C++中的`set`是STL提供的一种关联容器,用于存储唯一元素并自动按特定顺序(默认升序)排序。其内部通过红黑树实现,保证了高效的插入、删除和查找操作,时间复杂度均为O(log n)。`set`支持迭代器遍历,提供了良好的数据访问接口。
43 3
|
3月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
2月前
|
存储 设计模式 C++
【C++】优先级队列(容器适配器)
本文介绍了C++ STL中的线性容器及其适配器,包括栈、队列和优先队列的设计与实现。详细解析了`deque`的特点和存储结构,以及如何利用`deque`实现栈、队列和优先队列。通过自定义命名空间和类模板,展示了如何模拟实现这些容器适配器,重点讲解了优先队列的内部机制,如堆的构建与维护方法。
44 0
|
3月前
|
存储 缓存 Java
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
【用Java学习数据结构系列】HashMap与TreeMap的区别,以及Map与Set的关系
49 1
|
3月前
|
Kubernetes Cloud Native 流计算
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
Flink-12 Flink Java 3分钟上手 Kubernetes云原生下的Flink集群 Rancher Stateful Set yaml详细 扩容缩容部署 Docker容器编排
105 3
|
3月前
|
Kubernetes Linux 持续交付
docker容器学习
【10月更文挑战第1天】
50 1