如何在堆上创建一个数组并在构造时从另一个数组初始化它?
template <typename T>
T* Copy(T* myOriginalArray, size_t myOriginalArraySize)
{
T* copy = new T[myOriginalArraySize]; // copy data from myOriginalArray here too
return copy;
}
我可以创建数组然后使用 std::copy,但这需要数组内容有一个空的构造函数。您可以假设该对象具有复制和移动构造函数。我可以访问 C++17。
最佳答案
您使用 ::operator new
和 std::uninitialized_copy
#include<memory>
#include<new>
template<typename T>
T* Copy(T* src, size_t sz)
{
auto buf = static_cast<T*>(::operator new(sizeof(T) * sz));
std::uninitialized_copy(src, src + sz, buf);
return buf;
}
可能会移动,但会比较麻烦。
#include<utility>
template<typename T>
T* Move(T* src, size_t sz)
{
auto buf = static_cast<T*>(::operator new(sizeof(T) * sz));
for(size_t i = 0; i < sz; i++)
new (buf + i) T(std::move(src[i]));
return buf;
}
这不是一个好主意,考虑到你必须用一些疯狂的代码解除分配
template<typename T>
void Delete(T* src, size_t sz)
{
for(size_t i = 0; i < sz; i++)
src[i].~T();
::operator delete(src);
}
请考虑改用 std::vector
。
旁注
问:为什么用size_t
而不是T*
索引?
答:事实证明,它目前使用索引稍微快一些。
关于c++ - 从其他数组初始化堆数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43895429/