ACE篇之九:ACE容器之四(集合)

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;
}
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值