本文共 2390 字,大约阅读时间需要 7 分钟。
http://hi.baidu.com/qingshanyin/blog/item/086fa4343b6b0948251f14bd.html
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; } };转载地址:http://ovgxi.baihongyu.com/