博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ACE篇之十:ACE容器之六(映射表管理器)
阅读量:4169 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
盘点这些年我出的书,以及由此得到的收获
查看>>
用Python的Pandas和Matplotlib绘制股票KDJ指标线
查看>>
面试必问:对java多线程里Synchronized的思考
查看>>
最近接了本分布式组件面试书的选题,请大家一起来提意见
查看>>
Redis整合MySQL和MyCAT分库组件(来源是我的新书)
查看>>
Java程序员普遍存在的面试问题以及应对之道(新书第一章节摘录)
查看>>
程序员高效出书避坑和实践指南
查看>>
计算机方面毕业生怎样写简历
查看>>
从软件公司的异同点讲起,聊聊未来的程序员该如何选公司和谋规划
查看>>
我不想安于当前的限度,以达到所谓的幸福,回顾下2020年的我
查看>>
如何在面试中介绍自己的项目经验(面向java改进版)
查看>>
通过写n本书的积累,我似乎找到了写好技术文章的方法(回复送我写的python股票电子书)
查看>>
如果很好说出finalize用法,面试官会认为你很资深
查看>>
Java面试官经验谈:如何甄别候选人真实的能力,候选人如何展示值钱技能
查看>>
分析若干没面试机会和没体现实力的简历
查看>>
用python的matplotlib和numpy库绘制股票K线均线
查看>>
以互联网公司的经验告诉大家,架构师究竟比高级开发厉害在哪?
查看>>
GanttProject 使用的控件第三方包:jdnc-modifBen.jar
查看>>
ps、grep和kill联合使用杀掉进程
查看>>
openfire中的mina框架使用
查看>>