概述
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=================================