使用原始数组初始化动态数组

Initializing a dynamic array with a raw array

我有一个动态数组class,我想为此实现一个直接用原始数组初始化动态数组的功能,类似于std::vector

struct Array {
   int *ptr = NULL;
   int size;
   int capacity;
   
   Array() : size(0), capacity(0) {}
   Array(int capacity) : size(0), capacity(capacity) {
       ptr = (int*)malloc(capacity*sizeof(int));
   }
};

我们可以使用这样的原始数组初始化 std::vector

 std::vector<int> v = {1, 2, 3, 4};

似乎 std::vector 使用 std::initializer_list 来完成这个。不使用STL库是否可以达到相同的结果?这样我就可以像这样初始化它:

Array array = {1, 2, 3, 4};

Array array {1, 2, 3, 4};

如果没有 std::initializer_list 这是不可能的,我如何将其中的元素复制到动态数组?

这个

Array array = {1, 2, 3, 4};

未使用原始数组进行初始化。这使用初始化列表或统一初始化器。如果要使用原始数组,必须先定义它,如下所示。

我使用模板并通过引用传递来推断大小。

#include <iostream>
#include <algorithm>

struct Array {
    size_t size;
    size_t capacity;
    int *ptr = nullptr;

    template<size_t n>
    Array(int (&arr) [n]):size{n}, capacity{2*size}, ptr{ new int[capacity]}{

        std::copy(std::cbegin(arr), std::cend(arr), ptr);
    }
    ~Array(){delete[] ptr;}
};

int main(){
    int arr [] = {1, 2, 3, 4};
    Array array = arr;
    std::for_each(array.ptr, array.ptr+array.size, [](auto  el){std::cout << el << " ";});
}

Demo

这是另一种方法(使用统一初始化程序),如果你想初始化 class 正如你展示的那样

#include <iostream>
#include <algorithm>

struct Array {
    size_t size;
    size_t capacity;
    int *ptr = nullptr;


    template<class ... Args, class = std::enable_if_t<std::is_same_v<std::common_type_t<Args...>,int>>>
    Array(Args ... args):size{sizeof...(Args)}, capacity{2*size},ptr{ new int[capacity]}{

        int* temp = ptr;
        ((*(temp++) = args),...);
    }
    ~Array(){delete[] ptr;}
};

int main(){
    Array array = {1,2,3,4};
    std::for_each(array.ptr, array.ptr+array.size, [](auto  el){std::cout << el << " ";});
}

Demo

使用std::initializer_list<int>,它将是

#include <iostream>
#include <algorithm>

struct Array {
    size_t size;
    size_t capacity;
    int *ptr = nullptr;


    Array(std::initializer_list<int> && ls):size{ls.size()}, capacity{2*size},ptr{ new int[capacity]}{
        std::copy(ls.begin(), ls.end(), ptr);
    }
    ~Array(){delete[] ptr;}
};

int main(){
    Array array = {1,2,3,4};
    std::for_each(array.ptr, array.ptr+array.size, [](auto  el){std::cout << el << " ";});
}

Demo