浅谈C++|STL之set篇
一.set
1.1set基本概念
特点:
所有元素在插入时,会自动排序,并且不能插入重复元素。
本质:
set/multiset属于关联式容器,底层是红黑树。
set/multiset区别
1.set不允许容器中有重复的元素
2.multiset允许容器中有重复的元素
1.2set构造和赋值
-
构造set容器:
- 默认构造函数:std::set set_name;
- 区间构造函数:std::set set_name(iterator_begin, iterator_end);
- 拷贝构造函数:std::set set_name(another_set);
- 拷贝构造函数(部分元素):std::set set_name(another_set, iterator_begin, iterator_end);
-
赋值操作:
- 拷贝赋值:set_name = another_set;
- 移动赋值(自C++11起):set_name = std::move(another_set);
- 重载 = :std::set set_name = another_set;
其中,Type是set中存储的元素类型。需要注意的是,set中的元素默认按照升序进行排序,并且所有元素都是唯一的。如果需要自定义排序规则或元素比较函数,可以使用带有自定义比较函数的构造函数和赋值操作符。
以下是一些示例代码:
// 构造set容器 std::set mySet1; // 默认构造函数 int arr[] = {1, 2, 3, 4, 5}; std::set mySet2(arr, arr + 5); // 区间构造函数,指针也可 std::set anotherSet = mySet2; // 拷贝构造函数 // 赋值操作 std::set mySet3; mySet3 = anotherSet; // 拷贝赋值 std::set mySet4; mySet4 = std::move(anotherSet); // 移动赋值
构造函数 | 示例 |
---|---|
默认构造函数 | std::set set_name; |
区间构造函数 | std::set set_name(begin, end); |
拷贝构造函数 | std::set set_name(another_set); |
拷贝构造函数(部分元素) | std::set set_name(another_set, iterator_begin, iterator_end); |
赋值操作 | 示例 |
---|---|
拷贝赋值 | set_name = another_set; |
移动赋值(自C++11起) | set_name = std::move(another_set); |
1.3set大小和交换
在STL中,set(或者其他关联容器)具有以下两个常用的成员函数来获取容器的大小以及交换容器内容:
-
大小操作:
- size():返回容器中元素的个数。
- empty():检查容器是否为空,如果为空则返回true,否则返回false。
-
交换操作:
- swap():将当前容器的内容与另一个容器进行交换。
以下是使用示例:
#include #include int main() { std::set mySet = {1, 2, 3, 4, 5}; // 大小操作 std::cout std::cout std::cout 10, 20, 30}; mySet.swap(anotherSet); std::cout std::cout std::cout std::set5, 6, 7}; mySet.insert(anotherSet.begin(), anotherSet.end()); // 删除操作 mySet.erase(3); mySet.erase(mySet.find(4)); mySet.erase(mySet.begin(), mySet.find(5)); mySet.clear(); return 0; } std::set1, 2, 3, 4, 5}; // 查找操作 int count = mySet.count(3); std::cout std::cout std::cout std::set1, 2, 3}; auto result = mySet.insert(4); if (result.second) { std::cout std::cout std::cout std::cout bool operator()(int a, int b) const { return a b; // 降序排序 } }; int main() { std::set5, 2, 7, 1, 9}; // 打印排序后的set容器内容 for (const auto& elem : mySet) { std::cout std::string name; int age; // 通过重载
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。