[STL基础]set集合(一)

2014-11-24 08:28:37 · 作者: · 浏览: 0
[cpp]
#include
#include
#include
#include
using namespace std;
/*
set和multiset的内部结构通常是由平衡二叉树来实现的。当元素放入容器中时,会按照一定的排序法则自动排序,默认是按照less<>排序规则来排序。这种自动排序的特性加速了元素查找的过程,但是也带来了一个问题,不可以直接修改set或multiset容器中的元素值,因为这样就可能违反了元素自动排序的规则。如果你希望修改一个元素的值,必须先删除原有的元素,再插入新的元素。
一个集合(set)是一个容器,它其中的所包含的元素的值是唯一的。集合多集的区别是:set支持唯一的键值,set中的值都是特定的,而且只出现一次;而multiset中可以出现副本键,同一值可以出现多次。
*/
//定义及初始化;没有返回值,或void
void test0()
{
set f;
int myint[]={23,3,6,0};
setse(myint,myint+4);//初始化[beg,end)
setth(se.begin(),se.end());//初始化[beg,end),与上面雷同
setfo(se);//拷贝构造函数
}
//增加删除元素;返回值是void,除erase()的返回值是iterator外
void test1()
{ //insert:1.直接插入一个数据 2.在iterator位置上插入一个数据 3.插入[beg,end)一段数据
set myset;
set::iterator it;
for (int i=0;i<5;i++)
{
myset.insert(i*10);//0 10 20 30 40
}
std::pair::iterator,bool>ret=myset.insert(20);//20已经存在了,所以ret.second为false
if (!ret.second)
{
it=ret.first;
cout<<*ret.first<
}
myset.insert(it,24);
int myint[]={5,10,15};
myset.insert(myint,myint+3);//插入的是[beg,end);10已经存在了,没有插入
for (it=myset.begin();it!=myset.end();it++)
{
cout<<*it<<" ";//0 5 10 15 20 24 30 40
}
cout<
//erase:1.删除一个数据 2.删除在iterator位置上的数据 3.删除在[beg,end)区间的数据
myset.erase(24);//0 5 10 15 20 30 40
it=myset.begin();//5 10 15 20 30 40
myset.erase(it);
it=myset.find(20);
myset.erase(it,myset.end());//5 10 15
for (it=myset.begin();it!=myset.end();it++)
{
cout<<*it<<" ";//5 10 15
}
myset.clear();//删除所有元素
//set 的属性(通常是那些没有参数的函数):empty(),size()
if (myset.empty())//判断集合是否为空
{
cout<<"\nmyset is empty"<
}
if (myset.size()==0)//判断集合是否为空
{
cout<<"myset size is 0"<
}
int myints[]={24,12,18,9};
setfirst(myints,myints+2),second(myints+1,myints+4);//初始化是:[beg,end)
first.swap(second);
for (it=first.begin();it!=first.end();it++)
{
cout<<*it<<" ";//9 12 18
}
cout<
for (it=second.begin();it!=second.end();it++)
{
cout<<*it<<" ";//12 24
}
cout<
}
//访问获取元素;返回值是Type T
void test2()
{
int myint[]={75,23,65,42,13};
set myset(myint,myint+5);
cout<<*myset.find(65)<
cout<
}
//返回迭代器;返回值是iterator,或reverse_iterator
void test3()
{
int myint[]={75,23,65,42,13};
set myset(myint,myint+5);//初始化:[beg,end)
for (set::iterator it=myset.begin();it!=myset.end();it++)
{
cout<<*it<<" ";//13 23 42 65 75
}
cout<<"\nreverse myset:"<
for (set::reverse_iterator it=myset.rbegin();it!=myset.rend();it++)
{
cout<<*it<<" ";//75 65 42 23 13
}
cout<
}
//其他
void test4()
{
int myint[]={75,23,65,42,13};
set myset(myint,myint+5);//初始化:[beg,end)
set::key_compare com=myset.key_comp();
set::iterator it=myset.begin();
int keyHighest=*myset.rbegin();//不能使用*myset.end()
do
{
cout<<" "<<*it;//13 23 42 65 75
} while (com(*(it++),keyHighest));
cout<
set::value_compare val=myset.value_comp();
int valHighest=*myset.rbegin();
it=myset.begin();
do
{
cout<<" "<<*it;//13 23 42 65 75
} while (val(*(it++),valHighest));
cout<
set::iterator itlows,itups;
itlows=myset.lower_bound(42);
itups=myset.u