ACE篇之十:ACE容器之五(映射表管理器)

1、前言

关联容器支持高效的元素读取,基于键而不是在容器中的位置。例子有映射表和二叉树。
关联容器允许基于键进行读取和插入,但没有提供在容器中特定位置插入元素的机制映射表管理器ACE_Map_Manager,它被实现为动态的条目数组,每个条目由一个键/值对组成,一旦数组满了,就会分配新的内存,支持前向迭代和后向迭代。

声明语句:

ACE_Map_Manager<KeyType,DataElement,ACE_Null_Mutex> map_;

注意若有多个线程要访问映射表,需要将第三个参数设为ACE_Thread_Mutex

此外,由于ACE_Map_Manager要求键元素是可比较的,因此在插入映射表的键上,必须定义相等的操作符。

2、完整测试代码

(1)Map_Practice.h

#include "keyType.h"
#include "ace/Null_Mutex.h"
//关联容器支持高效的元素读取,基于键而不是在容器中的位置。例子有映射表和二叉树
//关联容器允许基于键进行读取和插入,但没有提供在容器中特定位置插入元素的机制
//映射表管理器ACE_Map_Manager,它被实现为动态的条目数组,
//每个条目由一个键/值对组成,一旦数组满了,就会分配新的内存
//支持前向迭代和后向迭代
class Map_Practice
{
public:
Map_Practice(void);
~Map_Practice(void);

int run(void);

void iterater_forward(void);
void iterater_reverse(void);
void removeall(void);

private:
//声明映射表管理器
ACE_Map_Manager<KeyType,DataElement,ACE_Null_Mutex> map_;
};
(2)Map_Practice.cpp

#include "Map_Practice.h"
#include "ace/Map_Manager.h"
#include "keyType.h"
Map_Practice::Map_Practice(void)
{
}

Map_Practice::~Map_Practice(void)
{
}
int Map_Practice::run()
{
ACE_TRACE(ACE_TEXT("Map_Practice::run"));

for(int i=0;i<100;i++)
{
   map_.bind(i,DataElement(i));
   ACE_DEBUG((LM_DEBUG,ACE_TEXT("Map has /n")));
   for(int j=0;j<100;j++)
   {
    DataElement d;
    map_.find(j,d);
    ACE_DEBUG((LM_DEBUG,ACE_TEXT("%d:"),d.getData()));
   }
   ACE_DEBUG((LM_DEBUG,ACE_TEXT("/n")));

   //执行前向迭代
   this->iterater_forward();
   //执行反向迭代
   this->iterater_reverse();
   //清除全部元素
   this->removeall();
   //执行前向
   this->iterater_forward();
}
return 0;
}
//前向迭代
void Map_Practice::iterater_forward()
{
ACE_TRACE(ACE_TEXT("Map_Practice::iterater_forward"));

ACE_DEBUG((LM_DEBUG,ACE_TEXT("Forward iteration/n")));
//运用针对ACE_Map_Manager的专用迭代器
for(ACE_Map_Manager<KeyType,DataElement,ACE_Null_Mutex>::iterator iter=map_.begin();
   iter!=map_.end();
   iter++)
{
   ACE_DEBUG((LM_DEBUG,ACE_TEXT("%d:"),(*iter).int_id_.getData()));
}
ACE_DEBUG((LM_DEBUG,ACE_TEXT("/n")));
}
//反向迭代
void Map_Practice::iterater_reverse()
{
ACE_TRACE(ACE_TEXT("Map_Practice::iterater_reverse"));

ACE_DEBUG((LM_DEBUG,ACE_TEXT("Reverse iteration/n")));
for(ACE_Map_Manager<KeyType,DataElement,ACE_Null_Mutex>::reverse_iterator iter=map_.rbegin();
   iter!=map_.end();
   iter++)
{
   ACE_DEBUG((LM_DEBUG,ACE_TEXT("%d:"),(*iter).int_id_.getData()));
}
ACE_DEBUG((LM_DEBUG,ACE_TEXT("/n")));
}
//移除全部元素
void Map_Practice::removeall()
{
//移除元素时候没有用到迭代器遍历映射表,原因是改变映射表的内容--移除或增加元素--会使迭代器失效
ACE_TRACE(ACE_TEXT("Map_Practice::removeall"));
map_.unbind_all();
ACE_DEBUG((LM_DEBUG,ACE_TEXT("/n")));
}

(3)键值类型定义:keyType.h

#pragma once
//前置定义
class KeyType;
bool operator==(const KeyType&,const KeyType&);
//插入映射表键类型,必须在其上定义相等操作符,因为ACE_Map_Manager要求键(或外部)元素是可以比较的
class KeyType
{
public:
//友元函数,所以可以访问其私有成员:相等操作符定义
friend bool operator==(const KeyType&,const KeyType&);

KeyType(){};
KeyType(int val):val_(val){};
KeyType(const KeyType&kt){this->val_=kt.val_;};
operator int(){return val_;};

private:
int val_;
};
bool operator==(const KeyType& a,const KeyType& b)
{
return(a.val_==b.val_);//访问对象的私有成员
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值