首页 > 解决方案 > 如何在 C++ 模板化列表类中实现高效添加

问题描述

假设我们有一个模板化的 c++ 列表类。是的,向量存在,但关键是要知道如何处理这个问题。

构造函数分配了一个包含 n 个 T 类型对象的块,但由于尚未使用它们而没有初始化。

在 add 方法中,我们希望复制一个新对象,但使用 operator = 是不可能的,因为 operator = 会首先破坏现有的对象,该对象从未被初始化。一个对象如何复制到 data[used] 中?

#include <string>
template<typename T>
class DynArray {
private:
  int capacity;
  int used;
  T* data;
public:
  DynArray(int initialCap) : capacity(initialCap), used(0), data((T*)new char[sizeof(T)*capacity]) {}
  void add(const T& e) {
    //TODO: if the dynarray is full, grow
    data[used++] = e; //ERROR! Should use copy constructor!!!
  }
};

int main() {
  DynArray<std::string> a(5);
  a.add(std::string("abc"));
}

标签: c++templatesplacement-new

解决方案


您应该使用新的展示位置:

void add(const T& e) {
    //TODO: if the dynarray is full, grow
    new (data + used) T(e);
    used++;
 }

Placement new 在已分配的内存中构造一个对象。


推荐阅读