1、前言
集合是不允许其所含条目重复的序列。ACE有两种集合:有界集合和无界集合,即ACE_Bounded_Set和ACE_Unbounded_Set。它们支持插入、查找、迭代。
2、测试完整源代码如下(原书本有多处错误)
#include "ace/Containers.h"
#include "DataElement.h"
//集合测试
//集合是不允许其所含条目重复的序列
//ACE有两种集合:有界集合和无界集合
class Set_Practice
{
public:
//测试有界集合:插入元素、执行查找、移除元素
int static runBoundedSet(void)
{
ACE_TRACE(ACE_TEXT("Set_Practice::runBoundedSet"));
ACE_DEBUG((LM_DEBUG,ACE_TEXT("Using a bounded set/n")));
//声明一个有界集合,元素是在栈上创建,所以函数退出后,内存将全部被释放
ACE_Bounded_Set<DataElement>bset(100);
DataElement elem[100];
for(int i=0;i<100;i++)
{
elem[i].setData(i);
//插入元素
bset.insert(elem[i]);
//insert返回值:-1--插入失败,1--插入值目前已经存在,0--插入成功
//原书有错误(p78)
if(bset.insert(elem[i])==1)
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("%p/n"),ACE_TEXT("You insert an item that is already present.")));
}
}
//元素个数
ACE_DEBUG((LM_DEBUG,ACE_TEXT("The sum of active objects is %d/n"),DataElement::numOfActiveObjects()));
DataElement elem1(10),elem2(49);
//查找元素
if(!bset.find(elem1)&&!bset.find(elem2))
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("The elements %d and %d are ")
ACE_TEXT("in the set!/n"),elem1.getData(),elem2.getData()));
}
for(int j=0;j<100;j++)
{
bset.remove(elem[j]);//从集合中移除元素
ACE_DEBUG((LM_DEBUG,ACE_TEXT("%d:"),elem[j].getData()));
}
ACE_DEBUG((LM_DEBUG,ACE_TEXT("/n")));
//元素移除后,再执行查找
if((bset.find(elem[0])==-1)&&(bset.find(elem[49])==-1))
{
ACE_DEBUG((LM_INFO,ACE_TEXT("The elements %d and %d are ")
ACE_TEXT("NOT in the set!/n"),elem[0].getData(),elem[49].getData()));
}
return 0;
}
//测试无界集合,元素在堆上创建
//通过迭代器来进行集合元素访问
int static runUnboudedSet(void)
{
ACE_TRACE(ACE_TEXT("Set_Practice::runBoundedSet"));
ACE_DEBUG((LM_DEBUG,ACE_TEXT("Using a unbounded set/n")));
//声明无界集合,元素是指针,因此在堆上创建
ACE_Unbounded_Set<DataElement*> uset;
for(int m=0;m<100;m++)
{
DataElement* elem;
ACE_NEW_RETURN(elem,DataElement(m),-1);
uset.insert(elem);//插入元素
}
DataElement deBegin(0),deEnd(99);
//查询元素
//从下面查询的参数看,很显然,元素是指针
if(!uset.find(&deBegin)&&!uset.find(&deEnd))
{
ACE_DEBUG((LM_DEBUG,ACE_TEXT("Not Found the elements/n")));
}
ACE_DEBUG((LM_DEBUG,ACE_TEXT("Deleting the elements/n")));
//迭代器声明
ACE_Unbounded_Set_Iterator<DataElement*> iter(uset);
//删除元素后,集合中的指针将是无效的
for(iter=uset.begin();iter!=uset.end();iter.advance())
{
DataElement* elem=(*iter);
ACE_DEBUG((LM_DEBUG,ACE_TEXT("%d:"),elem->getData()));
delete elem;
}
ACE_DEBUG((LM_INFO,ACE_TEXT("/n")));
return 0;
}
};