对象池(object_pool)

希望有人能给我提供一个思路:

img

img

img


麻烦各位如果不嫌麻烦,能加上注解,本人大一在校生假期自学C++,能力有限,C++水平仅仅局限于知道基本
的知识。许多库函数没有过多拓展。

赞自学 C++, 请问你 C 语言掌握得如何? 我觉得可以从 clang.csdn.net 入手。
C++ 主要是对面向对象的设计有帮助, 基本的工作,还是要从 C 语言开始学。

首先,我们需要定义一个类来表示对象池,包括以下内容:

对象池容量(C)
空闲链表的头索引(head)
后继数组(next)
对象数组(pool)

template <typename T>
class ObjectPool {
 public:
  explicit ObjectPool(size_t capacity)
      : capacity_(capacity),
        head_(1),
        next_(capacity + 1),
        pool_(capacity + 1) {}

  ~ObjectPool() = default;

 private:
  size_t capacity_;
  int head_;
  std::vector<int> next_;
  std::vector<T> pool_;
};

然后,我们可以实现对象池的初始化函数,用于初始化空闲链表和后继数组。

template <typename T>
void ObjectPool<T>::Init() {
  for (int i = 1; i < capacity_; ++i) {
    next_[i] = i + 1;
  }
  next_[capacity_] = 0;
}

接下来,我们可以实现分配对象的函数:

template <typename T>
int ObjectPool<T>::New() {
  if (head_ == 0) {
    return 0;
  }
  int p = head_;
  head_ = next_[head_];
  return p;
}

对于引用对象的函数,我们可以这样实现:

template <typename T>
const T& ObjectPool<T>::Ref(int p) const {
  if (p < 1 || p > capacity_) {
    std::cerr << "error" << std::endl;
    return pool_[0];
  }
  return pool_[p];
}


对于释放对象的函数,我们可以这样实现:

template <typename T>
void ObjectPool<T>::Delete(int p) {
  if (p == 0) {
    return;
  }
  if (p < 1 || p > capacity_) {
    std::cerr << "error" << std::endl;
    return;
  }
  next_[p] = head_;
  head_ = p;
}

最后,我们可以实现查询空闲链表头索引的函数:

template <typename T>
int ObjectPool<T>::Head() const {
  return head_;
}

完整的代码如下:

template <typename T>
class ObjectPool {
 public:
  explicit ObjectPool(size_t capacity)
      : capacity_(capacity),
        head_(1),
        next_(capacity + 1),
        pool_(capacity + 1) {}

  ~ObjectPool() = default;

  void Init();
  int New();
  const T& Ref(int p) const;
  void Delete(int p);
  int Head() const;

 private:
  size_t capacity_;
  int head_;
  std::vector<int> next_;
  std::vector<T> pool_;
};

template <typename T>
void ObjectPool<T>::Init() {
  for (int i = 1; i < capacity_; ++i) {
    next_[i] = i + 1;
  }
  next_[capacity_] = 0;
}

template <typename T>
int ObjectPool<T>::New() {
  if (head_ == 0) {
    return 0;
  }
  int p = head_;
  head_ = next_[head_];
  return p;
}

template <typename T>
const T& ObjectPool<T>::Ref(int p) const {
  if (p < 1 || p > capacity_) {
    std::cerr << "error" << std::endl;
    return pool_[0];
  }