如何实现高效的外接程序C++;模板列表类 假设我们有一个模板化C++列表类。是的,向量是存在的,但关键是要知道如何处理这个问题

如何实现高效的外接程序C++;模板列表类 假设我们有一个模板化C++列表类。是的,向量是存在的,但关键是要知道如何处理这个问题,c++,templates,placement-new,C++,Templates,Placement New,构造函数分配一个由n个类型为T的对象组成的块,但由于尚未使用这些对象,因此不会进行初始化 在add方法中,我们希望复制一个新对象,但是使用operator=是不可能的,因为operator=将首先销毁从未初始化过的现有对象。如何将对象中的一个副本复制到数据[已使用] #include <string> template<typename T> class DynArray { private: int capacity; int used; T* data;

构造函数分配一个由n个类型为T的对象组成的块,但由于尚未使用这些对象,因此不会进行初始化

在add方法中,我们希望复制一个新对象,但是使用operator=是不可能的,因为operator=将首先销毁从未初始化过的现有对象。如何将对象中的一个副本复制到数据[已使用]

#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"));
}
#包括
模板
类DynArray{
私人:
国际能力;
使用int;
T*数据;
公众:
DynArray(int initialCap):容量(initialCap),已使用(0),数据((T*)新字符[sizeof(T)*容量]{}
无效添加(const T&e){
//TODO:如果dynarray已满,请增长
数据[used++]=e;//错误!应使用复制构造函数!!!
}
};
int main(){
DynArray a(5);
a、 添加(std::string(“abc”);
}

DynArray类的类型为
T
,因此您只需分配一个大小为
initialCap
的类型T数组,即

new T[initialCap];
对于内置类型,例如int,元素未初始化

对于其他元素,如string,调用T的默认构造函数来初始化元素

在add方法中,我们希望复制一个新对象,但是使用operator=是不可能的,因为operator=将首先销毁现有对象


data[used++]=e这很好。它将
e
赋值给
data[used]
-调用字符串的赋值运算符,不会引起任何问题。但是,当阵列增长时,您需要分配容量加倍的新阵列,复制元素并销毁旧数据。

DynArray
类的类型为
T
,因此您只需分配一个大小为
initialCap
的T型阵列,这很简单

new T[initialCap];
对于内置类型,例如int,元素未初始化

对于其他元素,如string,调用T的默认构造函数来初始化元素

在add方法中,我们希望复制一个新对象,但是使用operator=是不可能的,因为operator=将首先销毁现有对象


data[used++]=e这很好。它将
e
赋值给
data[used]
-调用字符串的赋值运算符,不会引起任何问题。但是,当阵列增长时,您需要分配容量加倍的新阵列,复制元素并销毁旧数据。

您应该使用新的布局:

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

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

您应该使用Placement new:

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

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

对于您正在尝试执行的操作,您需要调用
T
's using。同时,也不要忘记实施:

模板
类DynArray{
私人:
国际能力;
使用int;
T*数据;
公众:
DynArray(int initialCap=0):容量(0)、已用容量(0)、数据(0){
储备(上限);
}
DynArray(const DynArray&src):容量(0)、已用容量(0)、数据(0){
备用(src.容量);
对于(int i=0;i=newSize;--i){
数据[i]->~T();
--使用;
}
}
}
无效添加(const T&e){
如果(已使用==容量){
储备(容量*1.5);
}
新(数据+使用)T(e);
++使用;
}
};

#包括
int main(){
DynArray a(5);
a、 添加(“abc”);
}

对于您正在尝试执行的操作,您需要调用
T
的using。同时,也不要忘记实施:

模板
类DynArray{
私人:
国际能力;
使用int;
T*数据;
公众:
DynArray(int initialCap=0):容量(0)、已用容量(0)、数据(0){
储备(上限);
}
DynArray(const DynArray&src):容量(0)、已用容量(0)、数据(0){
备用(src.容量);
对于(int i=0;i