如何在堆上创建一个数组并在构造时从另一个数组初始化它?
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。
答案 0 :(得分:2)
您使用::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*
?
A:事实证明,目前索引速度稍快一些。
答案 1 :(得分:0)
不确定这是否是您要求的,但您可以先分配内存,然后使用placement new
(这基本上是预分配STL容器所做的事情。)
template <typename T>
T* Copy(T* myOriginalArray, size_t myOriginalArraySize)
{
auto t_size = sizeof(T);
T* copy = (T *) new char[myOriginalArraySize * t_size];
for (size_t i = 0; i < myOriginalArraySize; i++)
{
new (copy + i) T(*(myOriginalArray + i));
}
return copy;
}