文章目录
- 引用头文件
- 初始化赋值
- 遍历 set 容器
- 1. 迭代器遍历
- 2. auto
- 3. range for循环
- 4. for_each
- 迭代器
- vector 常用方法
- 返回 set 长度
- 插入元素
- 删除元素
set
为关联式容器,翻译为集合,其中的元素类型为 pair
,需要注意 set
容器存储的各个键值对,要求键 key
和值 value
必须相等
基于 set
容器的这种特性,当使用 set
容器存储键值对时,只需要为其提供各键值对中的 value
值(也就是 key
的值)即可。
{<'a', 'a'>, <'b', 'b'>, <'c', 'c'>}
// 当要使用set容器存储上面这种键值对时,就可以转换成这样
{'a','b','c'}
set
容器会自行根据键的大小对存储的键值对进行排序,因为 set
容器中各键值对的键 key
和值 value
是相等的,根据 key
排序,也就等价为根据 value
排序。
-
- 唯一性:
set
中元素没有重复值
- 唯一性:
-
- 有序性:
set
容器中的元素按照升序排列
- 有序性:
引用头文件
#include <set>
初始化赋值
set<int> set2(set1);set<int> set1 = {1, 2, 3};vector<int> v = {1, 2, 3, 4};
set<int> s(v.begin(), v.end());
遍历 set 容器
不支持通过 索引 遍历
1. 迭代器遍历
void PrintfVector(set<int> s)
{// 注:如果参数为const set<int> 需要用const_iterator// set<int>::const_iterator iter=s.begin();for(set<int>::iterator it = s.begin(); it != s.end(); ++it){cout<<(*it)<<" ";}cout<<endl;
}
2. auto
void PrintfSet(set<int> s)
{// 注:如果参数为const set<int> 需要用const_iterator// set<int>::const_iterator iter=s.begin();for(auto it = s.begin(); it != s.end(); ++it){cout<<(*it)<<" ";}cout<<endl;
}
3. range for循环
void PrintfSet(set<int> s)
{// 注:如果参数为const vector<int> 需要用const_iterator// vector<int>::const_iterator iter=v.begin();for(auto key : s){cout<<( key )<<" ";}cout<<endl;
}
4. for_each
for_each(iterator beg, iterator end, _callback);
set<int> s = {3,5,1,7,10}; // vector容器auto print = [](const auto& x) // 定义一个lambda表达式
{cout << x << ",";
};
for_each(cbegin(v), cend(v), print);// for_each算法for_each( // for_each算法,内部定义lambda表达式cbegin(v), cend(v), // 获取常量迭代器[](const auto& x) // 匿名lambda表达式{cout << x << ",";}
);
迭代器
在 set
中,迭代器只支持 ++
和 –-
操作
vector 常用方法
方法 | 说明 |
---|---|
begin() | 返回指向容器中第一个(注意,是已排好序的第一个)元素的双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
end() | 返回指向容器最后一个元素(注意,是已排好序的最后一个)所在位置后一个位置的双向迭代器,通常和 begin() 结合使用。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
rbegin() | 返回指向最后一个(注意,是已排好序的最后一个)元素的反向双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。 |
rend() | 返回指向第一个(注意,是已排好序的第一个)元素所在位置前一个位置的反向双向迭代器。通常和 rbegin() 结合使用。如果 set 容器用 const 限定,则该方法返回的是 const 类型的反向双向迭代器。 |
cbegin() | 和 begin() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值。 |
cend() | 和 end() 功能相同,只不过在其基础上,增加了 const 属性,不能用于修改容器内存储的元素值。 |
find(val) | 在 set 容器中查找值为 val 的元素,如果成功找到,则返回指向该元素的双向迭代器;反之,则返回和 end() 方法一样的迭代器。另外,如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
count(val) | 在 set 容器中查找值为 val 元素的数量,由于set 中没有重复 key,所以其返回结果为 0/1 |
lower_bound(val) | 返回一个指向当前 set 容器中第一个大于或等于 val 的元素的双向迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
upper_bound(val) | 返回一个指向当前 set 容器中第一个大于 val 的元素的迭代器。如果 set 容器用 const 限定,则该方法返回的是 const 类型的双向迭代器。 |
size() | 返回 set 容器中元素数量 |
insert(key) | 在 set 容器中插入元素 key,set 容器会自动进行排序 |
erase(key) | 在 set 容器中删除元素 key |
clear(key) | 删除 set 容器中所有元素 |
返回 set 长度
s.size()
返回 set s
的元素个数
插入元素
s.insert(key)
将元素 key 插入到 s 中s.insert(v.begin(), v.end())
将 v 中元素插入到 s 中s.insert( {key1, key2, key3} )
插入多个元素
set<int> s = {1, 2, 3};
vector<int> v = {4, 5, 6};
s.insert(7);
s.insert(v.begin(), v.end()-1); // 插入 4 5
s.insert({8, 9}); // 插入 8 9
删除元素
s.erase(key)
删除值为 key 的元素s.erase(s.begin(), s.end())
删除 迭代器区间 的元素
set<int> s = {1, 2, 3, 4, 5, 6};
s.erase(6);
set<int>::iterator it = s.begin();
set<int>::iterator it1 = s.end();
it++;
it1--;
s.erase(it, it1 ); // s: 1 5