当前位置:   article > 正文

C++ STL set容器使用教程_stl set遍历

stl set遍历

set 为关联式容器,翻译为集合,其中的元素类型pair,需要注意 set 容器存储的各个键值对,要求键 key 和值 value 必须相等

基于 set 容器的这种特性,当使用 set 容器存储键值对时,只需要为其提供各键值对中的 value 值(也就是 key 的值)即可。

{<'a', 'a'>, <'b', 'b'>, <'c', 'c'>}
// 当要使用set容器存储上面这种键值对时,就可以转换成这样
{'a','b','c'}
  • 1
  • 2
  • 3

set 容器会自行根据键的大小对存储的键值对进行排序,因为 set 容器中各键值对的键 key 和值 value 是相等的,根据 key 排序,也就等价为根据 value 排序。

    1. 唯一性set中元素没有重复值
    1. 有序性set容器中的元素按照升序排列

引用头文件

#include <set>
  • 1

初始化赋值

set<int> set2(set1);

set<int> set1 = {1, 2, 3};

vector<int> v = {1, 2, 3, 4};
set<int> s(v.begin(), v.end());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

遍历 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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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 << ",";
    }
);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

迭代器

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 的元素个数

插入元素

  1. s.insert(key) 将元素 key 插入到 s 中
  2. s.insert(v.begin(), v.end()) 将 v 中元素插入到 s 中
  3. 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
  • 1
  • 2
  • 3
  • 4
  • 5

删除元素

  1. s.erase(key) 删除值为 key 的元素
  2. 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号