什么是正确的方法? 如何避免3个错误?
我尝试了以下内容:
#include <vector>
#include <array>
#include <iostream>
using namespace std;
struct s_4{double x,z,k,wsize;};
typedef vec4 vector <array<double,4>>; //ERROR #1
void main()
{
vector <s_4> s1;
vector <array<double,4>> d1;
s1.push_back(*new (s_4){10.0,11,1,0.25e-3}); //OK
d1.push_back(*new (array<double,4>){10.0,11,1,0.25e-3}); //OK
d1.push_back(*new (double[4]){10.0,11,1,0.25e-3}); //ERROR #2
vector <array<double,4>> d2{11,12,13,14.1}; //ERROR #3
getchar();
}
在向量中使用大型数组非常困难
答案 0 :(得分:3)
正确的代码是:
#include <vector>
#include <array>
#include <iostream>
using namespace std;
struct s_4{double x,z,k,wsize;};
typedef vector <array<double,4>> vec4;
int main()
{
vector <s_4> s1;
vector <array<double,4>> d1;
s1.push_back({10.0,11,1,0.25e-3});
d1.push_back({10.0,11,1,0.25e-3});
d1.push_back({10.0,11,1,0.25e-3});
vector <array<double,4>> d2{{11,12,13,14.1}};
return 0;
}
typedef中的第一个错误是typedef的名称是最后一个。
前三次push_backs泄漏内存,初始化时不需要命名类型。
第二个错误是因为c数组不能直接转换为std :: array。
最后一个需要两组大括号,一组用于初始化向量,另一组用于初始化每个数组。
答案 1 :(得分:2)
除了艾伦的回答:
为什么要尝试在堆上分配数组?您可以将数组放在堆栈上并使用初始化列表:
#include <vector>
#include <array>
#include <iostream>
int main()
{
std::vector <std::array<double,4>> data = {
{10.0,11,1,0.25e-3},
{10.0,11,1,0.25e-3},
{10.0,11,1,0.25e-3},
{11,12,13,14.1}
};
}
但是,初始化列表是C ++ 11的一个功能,因此您可以使用-std=c++11
进行编译:
g++ -g -Wall -O2 -std=c++11 test.cpp -o test
此外,您应该避免using namespace std
,因为如果您使用其他库来实现数学计算的矢量,这可能会导致问题。