使用原始数组初始化动态数组
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 << " ";});
}
这是另一种方法(使用统一初始化程序),如果你想初始化 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 << " ";});
}
使用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 << " ";});
}
我有一个动态数组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 << " ";});
}
这是另一种方法(使用统一初始化程序),如果你想初始化 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 << " ";});
}
使用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 << " ";});
}