STL set和multiset的用法

概述

set和multiset是STL提供的两种相似的关联式容器。在STL中,关联式容器会根据一定的排序准则,对元素自动排序。正因为自动排序,直接改变set或multiset中某个元素的值是不被允许的——因为这样会打乱排序。所以,要改变元素值,推荐做法是先删除旧元素,然后插入新元素。

set和multiset的区别在于:在set中,每个元素值只能出现一次,不能重复,而multiset则允许重复。


构造方式

在set和multiset的型别定义中,有一个模板参数叫做Compare,可自定义,用来指定元素间的排序准则,默认值为less<T>.

除此之外,他们的构造方式与序列式容器类似:默认构造、拷贝构造、迭代器赋值构造。


属性访问

对于这两种容器,可调用函数进行容器大小查询、迭代器获取、容器间相互比较、元素查找等操作。


赋值和编辑

对于赋值而言,set和multiset都只提供基本赋值操作——等号赋值、元素交换。

而在元素的安插和移除操作中,有两点需要注意:一是set容器因为元素值唯一性,所以安插操作不一定会成功;二是由于自动排序的性质,两种容器均不提供push_back等操作。


代码示

(由于二者相似度很大,此处只以set的使用为例)

/*************************/
/* SetTest.cpp          */
/*************************/
#include <iostream>
#include <set>

typedef std::set<int> IntSet;

// 打印.
static void PrintIntSet(IntSet& intList, const char * szName);

int main(int argc, char *argv[])
{
	int i;
	
	// 不同构造方式.
	IntSet intSet_1;
	for(i=0; i<10; ++i)
	{
		intSet_1.insert(i);
	}
	IntSet intSet_2(intSet_1);
	
	// 打印.
	PrintIntSet(intSet_1, "intSet_1");
	PrintIntSet(intSet_2, "intSet_2");
	
	i = 8;
	std::cout<<std::endl<<"删除集合中值为"<<i<<"的元素..."<<std::endl;
	intSet_1.erase(i);
	PrintIntSet(intSet_1, "intSet_1");
	
	i = 5;
	std::cout<<std::endl<<"删除集合中值为"<<i<<"的元素之前所有元素..."<<std::endl;
	intSet_1.erase(intSet_1.begin(), intSet_1.find(6));
	PrintIntSet(intSet_1, "intSet_1");
	
	std::cout<<std::endl<<"交换两个集合的值..."<<std::endl;
	intSet_1.swap(intSet_2);
	PrintIntSet(intSet_1, "intSet_1");
	PrintIntSet(intSet_2, "intSet_2");

	std::cout<<std::endl<<"清空集合..."<<std::endl;
	intSet_1.clear();
	PrintIntSet(intSet_1, "intSet_1");
	std::cout<<"集合是否为空:"<<intSet_1.empty()<<std::endl;
	
	return 0;
}

void PrintIntSet(IntSet& intSet, const char * szName)
{
	std::cout<<"["<<szName<<"]: ";
	
	std::copy(intSet.begin(), intSet.end(),
		std::ostream_iterator<int>(std::cout, " "));
	
	std::cout<<std::endl;
}

运行结果:



==============================End=================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值