在C ++(14/17)中,如何在没有硬编码的括号括起来的Initializor列表的情况下初始化(大型)结构数组?
例如,如果需要大量初始化或直到运行时才知道初始化值,该怎么办?似乎没有关于此的帖子。我创建了一个简单的示例,说明了我希望做的事情。希望有人可以解释如何做到这一点:
struct myStruct
{
int value;
myStruct(int input)
{
value = input*input;
}
};
int main()
{
// option #1 - aggregate initialization
myStruct array1[] {{1},{2},{3},{4},{5}};
// option #2 - using available array (??)
int input[5] = {1,2,3,4,5};
myStruct array2[] { input[] } ; // something like this?
return(0);
}
答案 0 :(得分:2)
如果直到运行时才知道数组的大小,则要使用的容器为std::vector<myStruct>
。但是,为此,您需要在myStruct
中使用默认构造函数。
您可以使用std::transform
从myStruct
值构造int
对象并填充std::vector
。
说明代码:
#include <vector>
#include <algorithm>
struct myStruct
{
int value;
myStruct() : myStruct(0) {}
myStruct(int input)
{
value = input*input;
}
};
int main()
{
// option #2 - using available array (??)
int input[5] = {1,2,3,4,5};
int size = sizeof(input)/sizeof(*input);
// array2 has to be of the right size before the call to std::transform
// std::transform does not call push_back. It simply assigns the value to
// the dereferenced iterator.
std::vector<myStruct> array2(size);
std::transform(std::begin(input),
std::end(input),
array2.begin(),
[](int v) -> myStruct { return myStruct(v); });
return(0);
}
可以使用myStruct
和std::copy
来避免使用std::back_inserter
的默认构造函数。
#include <vector>
#include <algorithm>
struct myStruct
{
int value;
myStruct(int input)
{
value = input*input;
}
};
int main()
{
int input[5] = {1,2,3,4,5};
// Create an empty vector.
std::vector<myStruct> array2;
// Add items to the vector by using std::copy and std::back_inserter.
std::copy(std::begin(input),
std::end(input),
std::back_inserter(array2));
return(0);
}