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



我有一个动态数组类,我想为它实现直接用原始数组初始化动态数组的功能,类似于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 << " ";});
}

演示

这是另一种方法(使用统一初始化器(,如果你想像一样初始化你的类

#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 << " ";});
}

演示

使用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 << " ";});
}

演示

最新更新