c++ - 从其他数组初始化堆数组

标签 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。

最佳答案

您使用 ::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*索引?
答:事实证明,它目前使用索引稍微快一些。

关于c++ - 从其他数组初始化堆数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43895429/

相关文章:

c++ - 使用opengl和c++使用动画(经过一段时间后一个一个地)翻译三角形

java - OSX 和 Windows 的字节数据类型有区别吗

java - 比较Java中的两个POJO对象并显示差异

python - 通过 Cython 将 numpy 数组传递和返回给 C++ 方法

c++ - 将数组数据插入模板

c++ - 在 C++ 中线程化 for 循环

c++ - g++ -std=c++0x 和兼容性

arrays - Fortran 中继承派生类型问题的可分配数组

C++ - 将 ANSI 编码的文本读取为宽字符串

c++ - QMediaPlayer 给我有关视频的错误信息