本文共 3001 字,大约阅读时间需要 10 分钟。
http://hi.baidu.com/qingshanyin/blog/item/559cedfa77411d9159ee9090.html
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_);//访问对象的私有成员 }转载地址:http://lvgxi.baihongyu.com/