zeromq实现了一个可以快速访问,插入,删除的数组,该数组只保存指针类型。所有可以保存在数组中的元素需要继承自array_item_t<ID>。ID参数可以用于把同一个对象指针保存在不同的数组中。
//仅仅保存了该元素在数组中的索引
template <int ID = 0> class array_item_t
{
public:
inline array_item_t () :array_index (-1)
{
}
inline virtual ~array_item_t ()
{
}
inline void set_array_index (int index_)
{
array_index = index_;
}
inline int get_array_index ()
{
return array_index;
}
private:
int array_index;
array_item_t (const array_item_t&);
const array_item_t &operator = (const array_item_t&);
};
数组array_t中真实数据保存在一个std::vector数组中:
typedef std::vector <T*> items_t;
items_t items;
插入数据,直接在数组最后压入:
inline void push_back (T *item_)
{
if (item_)
((item_t*) item_)->set_array_index ((int) items.size ());
items.push_back (item_);
}
主要是数据快速删除操作:
inline void erase (T *item_) {
erase (((item_t*) item_)->get_array_index ());
}
inline void erase (size_type index_) {
//将数组最后一个元素index设为要被移除位置
if (items.back ())
((item_t*) items.back ())->set_array_index ((int) index_);
//最后一个元素覆盖被移除数据
items [index_] = items.back ();
//移除最后一个元素
items.pop_back ();
}