从其他数组初始化堆数组

时间:2017-05-10 14:29:31

标签: c++ arrays

如何在堆上创建一个数组并在构造时从另一个数组初始化它?

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。

2 个答案:

答案 0 :(得分:2)

您使用::operator newstd::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;
}