在一行中初始化和引入数组向量的正确方法?

时间:2018-06-06 09:08:48

标签: c++

什么是正确的方法? 如何避免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();
}

在向量中使用大型数组非常困难

2 个答案:

答案 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,因为如果您使用其他库来实现数学计算的矢量,这可能会导致问题。