红黑树
红黑树是一种平衡二叉树,它在最差的情况下的对元素的查找性能(时间复杂度)优于其他任何一种数据结构。如果你的设计要求高效稳定,在查找的频率较高并且数据量比较大的情况下红黑树这种数据结构是一个较为理想的选择。ACE通过ACE_RB_Tree模板容器实现了红黑树的实现,提供了元素的插入查找删除遍历功能。ACE_RB_Tree通过ACE_Less_Than模板实现在插入树各个键元素之间进行二叉排序(类似hash表容器中的ACE_Equal_To)。ACE提供了若干个ACE_Less_Than模板的特化版本,但是大多数情况下你要为自己定义的键元素创建自己的特化版本。
示例代码
RB_Tree_Functors.h
头文件RB_Tree_Functors.h定义了键元素KeyType并且实现了ACE_Less_Than模板对KeyType的特化
/* -*- C++ -*- */
// RB_Tree_Functors.h,v 1.3 2005/12/02 08:45:34 isisbuilds Exp
#ifndef __RB_TREE_FUNCTORS_H_
#define __RB_TREE_FUNCTORS_H_
#include "ace/Functor.h"
// Listing 1 code/ch05
// Same key type.
class KeyType
{
public:
KeyType () : val_(0) {}
KeyType (int i) : val_ (i) {}
KeyType (const KeyType& kt) { this->val_ = kt.val_; }
operator int() const { return val_; };
private:
int val_;
};
ACE_BEGIN_VERSIONED_NAMESPACE_DECL
//特化KeyType
template<>
class ACE_Less_Than<KeyType>
{
public:
int operator() (const KeyType k1, const KeyType k2)
{ return k1 < k2; }
};
ACE_END_VERSIONED_NAMESPACE_DECL
// Listing 1
#endif /* __RB_TREE_FUNCTORS_H_ */
RB_Tree_Functors.cpp
此示例演示了ACE_RB_Tree模板容器对数据的插入、删除、查找、遍历等功能。
// RB_Tree_Functors.cpp,v 1.2 2006/03/30 12:41:43 jwillemsen Exp
#include "ace/Log_Msg.h"
#include "DataElement.h"
#include "RB_Tree_Functors.h"
// Listing 0 code/ch05
#include "ace/RB_Tree.h"
#include "ace/Synch.h"
// Little helper class.
template<class EXT_ID, class INT_ID>
class Tree : public ACE_RB_Tree<EXT_ID, INT_ID,
ACE_Less_Than<EXT_ID>,
ACE_Null_Mutex>
{};
// Listing 0
class Tree_Example
{
public:
// Illustrate the tree.
int run (void);
private:
// Use the forward iterator.
void iterate_forward (void);
// Use the reverse iterator.
void iterate_reverse (void)