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_);//访问对象的私有成员
}