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
中,迭代器只支持 ++
和 –-
操作文章来源:https://www.toymoban.com/news/detail-689233.html
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
的元素个数文章来源地址https://www.toymoban.com/news/detail-689233.html
插入元素
-
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
到了这里,关于C++ STL set容器使用教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!