目录
set
1. 构造、析构和赋值运算符重载
1.1 构造函数
1.2 析构函数
1.3 赋值运算符重载
2. 迭代器
3. 容量
4. 修改器
5. 观察者
6. 操作
7. 分配器
set
set是按照特定顺序存储唯一元素的容器。
在一个set中,一个元素的值也是它的标识(值本身就是关键字,类型为T),并且每个值必须是唯一的。一旦在容器中,集合中的元素的值就不能被修改(元素总是不变的),但是它们可以被插入或从容器中移除。
在内部,set中的元素总是按照其内部比较对象(Compare类型)所指示的特定的严格的弱排序标准进行排序。
set容器通常比unordered_set容器通过键来访问单个元素要慢一些,但是它们允许根据子集的顺序来直接迭代。
set通常被实现为二叉搜索树。
使用set类型要包含set头文件;set定义在命名空间std中。
1. 构造、析构和赋值运算符重载
1.1 构造函数
重载函数 | 功能 |
---|---|
empty | 构造空的set类对象 |
range | 用迭代器区间[first,last)中的元素构造 |
copy | 构造一个x的拷贝 |
move | 移动构造函数 |
initializer list | 用初始化列表来构造 |
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s1;//empty
for (auto e : s1)
{
cout << e << " ";
}
cout << endl;
//空
int arr[10] = { 4,2,2,9,6,6,6,1,7,10 };
set<int> s2(arr, arr + 10);//range
for (auto e : s2)
{
cout << e << " ";
}
cout << endl;
//1 2 4 6 7 9 10
set<int> s3(s2);//copy
//等价于set<int> s3 = s2;
for (auto e : s3)
{
cout << e << " ";
}
cout << endl;
//1 2 4 6 7 9 10
set<string> s4{ "happy","new","year","hello","world" };//initializer list
//等价于set<string> s4 = { "happy","new","year","hello","world" };
for (auto e : s4)
{
cout << e << " ";
}
cout << endl;
//happy hello new world year
return 0;
}
1.2 析构函数
1.3 赋值运算符重载
2. 迭代器
函数 | 功能 |
---|---|
begin & end | begin返回一个迭代器,指向set对象的第一个元素 end返回一个迭代器,指向set对象的最后一个元素的下一个位置 |
rbegin & rend | rbegin返回一个反向迭代器,指向set对象的最后一个元素 rend返回一个反向迭代器,指向set对象的第一个元素的上一个位置 |
cbegin & cend | cbegin返回一个const迭代器,指向set对象的第一个元素 cend返回一个const迭代器,指向set对象的最后一个元素的下一个位置 |
crbegin & crend | crbegin返回一个const反向迭代器,指向set对象的最后一个元素 crend返回一个const反向迭代器,指向set对象的第一个元素的上一个位置 |
begin&end和rbegin&rend返回的迭代器指向:
const_iterator是一个指向const内容的迭代器。迭代器本身可以修改,但是它不能被用来修改它所指向的内容。
begin&end/rbegin&rend和cbegin&cend/crbegin&crend的不同:
- begin&end/rbegin&rend的返回类型由对象是否是常量来决定。如果不是常量,返回iterator;如果是常量,返回const_iterator。
- cbegin&cend/crbegin&crend的返回类型是const_iterator,不管对象本身是否是常量。
但是set的迭代器是const的!!!虽然set类型同时定义了iterator和const_iterator类型,但两种类型都只允许只读访问set中的元素。
#include <iostream>
#include <set>
using namespace std;
int main()
{
int arr[10] = { 4,2,2,9,6,6,6,1,7,10 };
set<int> s(arr, arr + 10);
set<int>::iterator it = s.begin();
while (it != s.end())
{
cout << *it << " ";
++it;
}
cout << endl;
//1 2 4 6 7 9 10
auto rit = s.rbegin();
//list<int>::reverse_iterator rit = lt.rbegin();
while (rit != s.rend())
{
cout << *rit << " ";
++rit;
}
cout << endl;
//10 9 7 6 4 2 1
return 0;
}
3. 容量
函数 | 功能 |
---|---|
empty | 检测set是否为空,是返回true,否则返回false |
size | 返回set的元素个数 |
max_size | 返回set所能容纳的最大元素数 |
#include <iostream>
#include <set>
using namespace std;
int main()
{
int arr[10] = { 4,2,2,9,6,6,6,1,7,10 };
set<int> s(arr, arr + 10);//1 2 4 6 7 9 10
if (s.empty())
cout << "set为空" << endl;
else
cout << "set不为空" << endl;
//set不为空
cout << s.size() << endl;//7
cout << s.max_size() << endl;//214748364
return 0;
}
4. 修改器
函数 | 功能 |
---|---|
insert | 插入元素 |
erase | 删除元素 |
swap | 交换内容 |
clear | 清空内容 |
emplace | 构建和插入元素 |
emplace_hint | 构建和插入带有提示的元素 |
#include <iostream>
#include <set>
using namespace std;
int main()
{
int arr[10] = { 4,2,2,9,6,6,6,1,7,10 };
set<int> s1(arr, arr + 10);//1 2 4 6 7 9 10
s1.insert(5);
s1.insert(0);
for (auto e : s1)
{
cout << e << " ";
}
cout << endl;
//0 1 2 4 5 6 7 9 10
s1.erase(--s1.end());
s1.erase(4);
for (auto e : s1)
{
cout << e << " ";
}
cout << endl;
//0 1 2 5 6 7 9
set<int> s2{ 7,3,6,8,1 };
s1.swap(s2);
for (auto e : s1)
{
cout << e << " ";
}
cout << endl;
//1 3 6 7 8
s1.clear();
if (s1.empty())
cout << "s1被清空" << endl;
else
cout << "s1没被清空" << endl;
//s1被清空
return 0;
}
5. 观察者
函数 | 功能 |
---|---|
key_comp | 返回比较对象 |
value_comp | 返回比较对象 |
6. 操作
函数 | 功能 |
---|---|
find | 获取元素的迭代器 |
count | 计算特定元素的数量 返回值0或1 |
lower_bound | 返回指向下限的迭代器 |
upper_bound | 返回指向上限的迭代器 |
equal_range | 获取相等元素的范围 范围内只有一个元素 |
#include <iostream>
#include <set>
using namespace std;
int main()
{
int arr[10] = { 4,2,2,9,6,6,6,1,7,10 };
set<int> s(arr, arr + 10);//1 2 4 6 7 9 10
auto it = s.find(2);
if (it != s.end())
{
cout << "2在set中" << endl;
}
else
{
cout << "2不在set中" << endl;
}
//2在set中
it = s.find(3);
if (it != s.end())
{
cout << "3在set中" << endl;
}
else
{
cout << "3不在set中" << endl;
}
//3不在set中
if (s.count(7))
{
cout << "7在set中" << endl;
}
else
{
cout << "7不在set中" << endl;
}
//7在set中
if (s.count(5))
{
cout << "5在set中" << endl;
}
else
{
cout << "5不在set中" << endl;
}
//5不在set中
return 0;
}
7. 分配器
函数 | 功能 |
---|---|
get_allocator | 获取分配器 |