C++ Set容器构造和赋值
在C++中,std::set
是一个用于存储唯一元素的有序集合容器。下面介绍一下std::set
容器的构造和赋值操作:
构造 std::set
- 默认构造函数:
std::set<int> mySet; // 创建一个空的set
- 使用初始化列表构造:
std::set<int> mySet = {1, 2, 3, 4, 5}; // 创建包含初始值的set
- 区间构造函数:
std::vector<int> vec = {9, 8, 7}; std::set<int> mySet(vec.begin(), vec.end()); // 使用迭代器范围进行构造
赋值 std::set
- 拷贝赋值:
std::set<int> set1 = {1, 2, 3}; std::set<int> set2; set2 = set1; // 将set1的内容拷贝给set2
- 移动赋值(C++11引入):
std::set<int> set1 = {1, 2, 3}; std::set<int> set2; set2 = std::move(set1); // 移动set1的内容给set2,set1变为空
- 使用赋值运算符
= {}
:
std::set<int> set1 = {1, 2, 3}; set1 = {4, 5, 6}; // 覆盖原有set1内容,现在set1包含{4, 5, 6}
- 使用
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
容器中进行插入和删除操作:
插入操作
- 使用
insert
函数插入单个元素:
std::set<int> mySet = {1, 2, 3}; mySet.insert(4); // 向 set 中插入元素 4
- 使用
insert
函数插入多个元素:
std::set<int> mySet = {1, 2, 3}; mySet.insert({4, 5, 6}); // 向 set 中插入元素 4, 5, 6
删除操作
- 使用
erase
函数删除指定元素:
std::set<int> mySet = {1, 2, 3, 4}; mySet.erase(3); // 从 set 中删除值为 3 的元素
- 使用
erase
函数通过迭代器删除元素:
std::set<int> mySet = {1, 2, 3, 4}; auto it = mySet.find(2); if (it != mySet.end()) { mySet.erase(it); // 通过迭代器 it 删除元素 }
- 清空整个 set 容器:
std::set<int> mySet = {1, 2, 3, 4}; mySet.clear(); // 清空 set 中的所有元素
C++ Set容器查找和统计
在 C++ 中,std::set
是一种关联容器,用于存储唯一元素的有序集合。下面介绍如何在 std::set
容器中进行查找和统计操作:
查找元素
- 使用 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; }
- 使用 count 函数统计元素个数:
std::set<int> mySet = {1, 2, 2, 3, 3, 3}; int count = mySet.count(2); std::cout << "元素 2 的个数为: " << count << std::endl;
统计元素个数
- 遍历并统计元素出现次数:
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; }
- 使用 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::set
和 std::multiset
都属于关联容器,用于存储有序的元素集合,但它们在元素唯一性方面有所不同。下面介绍一下 std::set
和 std::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::set
或 std::multiset
来存储数据,如果需要确保集合中不包含重复元素,则使用 std::set
;如果允许重复元素存在,则使用 std::multiset
。
C++ Set容器内置类型指定排序规则
在 C++ 的 std::set
容器中,默认情况下元素是按照严格的弱排序规则进行排序。但是,你也可以通过指定自定义的排序准则来对容器中的元素进行排序。下面介绍如何在 std::set
中指定排序规则:
- 使用函数对象(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
中的元素按降序排列。
- 使用 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
的自定义结构体,其中包含 name
和 age
两个成员变量。
#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
容器中的排序规则,以满足你的特定需求。