c++ - 如何在 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"));
}
解决方案
您应该使用新的展示位置:
void add(const T& e) {
//TODO: if the dynarray is full, grow
new (data + used) T(e);
used++;
}
Placement new 在已分配的内存中构造一个对象。
推荐阅读
- python - Networkx:反链算法示例
- python-3.x - 如何通过 arduino 发送的 api 提供数据?
- azure-devops - npm 任务运行时日志不可见
- python - Python:ValueError:无法解码任何 JSON 对象
- javascript - 从单独的 php 脚本调用 javascript 函数?
- openstreetmap - 如何在 overpass turbo 中编写具有两个要求的查询?
- php - Laravel 上的关系
- ruby-on-rails - 如何使用 Docker 创建它
- sql - 在 T-SQL SQL-SERVER 中将单个 XML 括号列转换为多列
- dicom - 如何使用 ClearCanvas 库添加私有 DICOM 标签?