STL关联式容器(2)——set和multiset

本文深入探讨了C++标准模板库(STL)中set和multiset容器的特性和使用方法。从set的基本概念入手,介绍了其底层实现、元素的唯一性和排序特性,并详细解释了set的构造、增删查改等操作。同时,对比了set与multiset的区别,即multiset允许元素重复。文章提供了丰富的代码示例,帮助读者理解并掌握set和multiset的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、set

1. 在 set 中,元素的 value 也标识它( value 就是key,类型为 T ),并且每个 value 必须是唯一的。set 中的元素不能在容器中修改(元素总是 const),但是可以从容器中插入或删除它们。
2.  与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set 中只放 value,但在底层实际存放的是由<value, value>构成的键值对。
3. set 中的元素不可以重复(因此可以使用set进行去重)。
4. set 中的元素默认按升序排序,所以set 常用来排序和去重。
5. set 底层是用红黑树来实现的。

我们来看一下 set 模板参数声明:

1. T :set中存放元素的类型,实际在底层存储<value, value>的键值对。
2. Compare:set 中元素默认按照小于来比较。
3. Alloc:set 中元素空间的管理方式,使用STL提供的空间配置器管理。

set 的迭代器

与其他容器一样,set 也有 iterator 、const_iterator、reverse_iterator、const_reverse_iterator。关于迭代器我们不作过多说明,可以简单实现一个通过迭代器遍历函数(后面要用到)。
 

void print(set<T>& s)
{
	set<T>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;
}

set 的默认成员函数(构造、拷贝构造、赋值运算符重载)

函数声明功能
explicit set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());
构造空的set
template <class InputIterator>
set (InputIterator first, InputIterator last,const key_compare& comp = key_compare(),const allocator_type& = allocator_type());
用[first,last)区间的元素构造set
set (const set& x);拷贝构造
set& operator= (const set& x)
赋值运算符重载

注意:set 可以使用花括号的方式来初始化构造。

void testset1()
{
	set<int> s1;
	set<int> s2{
		{ 2 }, { 4 }, { 1 }, { 1 },{ 6 }
		, { 3 }, { 5 }, { 4 }
	};
	set<int> s3(s2);
	set<int> s4(s2.begin(), s2.end());
	s1 = s3;
	print(s1);
	print(s2);
	print(s3);
	print(s4);
}

程序运行结果:

set 的增删查改

函数声明功能
pair<iterator,bool> insert (const value_type& val)
在set中插入val,实际插入<val,val>键值对。返回值为pair:如果插入成功,返回一个<val的迭代器,true>;插入失败说明val已经存在,返回<val迭代器,false>
iterator insert (const_iterator position, const value_type& val)
在position位置插入val,实际插入<val,val>构成的键值对,position只是一个参考,不一定在该位置插入
template <class InputIterator>
void insert (InputIterator first,InputIterator last)
在set中插入 [first,last)区间的元素
iterator  erase (const_iterator position)
删除position位置上的元素
size_type erase (const value_type& val)
删除val 元素,返回删除元素个数
iterator  erase (const_iterator first, const_iterator last)
删除[first,last)区间中的元素
void swap (set& x)
交换两个set
void clear() noexcept;
清空set
const_iterator find (const value_type& val) const
查找值为val的元素,返回const_iterator
size_type count (const value_type& val) const
返回set中值为val的元素个数


 

void testset2()
{
	set<int> s1;
	pair<set<int>::iterator, bool> ret;
	int arr[] = { 5, 2, 5, 1, 4, 3 };
	ret = s1.insert(3);
	s1.insert(s1.find(2), 6);
	s1.insert(arr, arr + 6);
	print(s1);
	cout << *(ret.first) << " " << ret.second << endl;

	set<int> s2(s1);
	s1.erase(s1.find(3));
	s1.erase(5);
	print(s1);

	s1.swap(s2);
	print(s1);
	print(s2);

	s1.clear();
	print(s1);

	cout << s2.count(2) << endl;
	
}

程序运行结果:

二、multiset

multiset 和 set 的使用基本一样,唯一不同的地方是 multiset 可以存在重复元素,我们简单了解一下即可:
 

void testmultiset()
{
	multiset<int> s
	{ { 3 }, { 4 }, { 2 }, { 2 }, 
	{ 1 }, { 6 }, { 3 }, { 5 } };

	multiset<int>::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it << " ";
		it++;
	}
	cout << endl;

}

程序运行结果:

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值