初始化包含vector的结构

时间:2012-02-02 16:35:41

标签: c++ struct

我正在寻找一种初始化复杂结构的方法,该结构在一行中包含向量。

例如,如果我有这种结构:

struct A{
  double x;
  double y;
};
struct B{
  double z;
  double W;
};
struct C{
  A a;
  B b;
};

我可以用这种方式初始化C:C c = {{0.0,0.1},{1.0,1.1}};

但是如果我必须初始化这样的结构呢?

struct A{
  double x;
  double y;
};
struct B{
  vector<double> values;
};
struct C{
  A a;
  B b;
};

我必须在一行中完成它,因为我想允许我的应用程序的用户在单个字段中指定所有初始值。当然,我更喜欢采用标准方式来做而不是自定义方式。

谢谢!

6 个答案:

答案 0 :(得分:9)

您可以在C ++中以非常类似的方式初始化C:C:

C c = {{0.3, 0.01}, {{14.2, 18.1, 0.0, 3.2}}};

答案 1 :(得分:3)

如果你没有使用C ++ 11(所以你不能使用Mankarse的建议),boost可以提供帮助:

C c = { {0.1, 0.2}, {boost::assign::list_of(1.0)(2.0)(3.0)} };

答案 2 :(得分:0)

你可以这样做:

C obj = { { 0.0, 0.1f }, std::vector<double>( 2, 0.0 ) };

但显然它并不理想,因为载体中的所有值都必须相同。

答案 3 :(得分:0)

问题是如何在第二个例子中初始化B?

你无法初始化这样的矢量:

std::vector<int> v = { 1, 2, 3 }; // doesn't work

你可以这样做

int data[] = { 1, 2, 3 };
std::vector<int> v( &data[0], &data[0]+sizeof(data)/sizeof(data[0]));

(有更好的方法可以做到这一点)。但这不是“一线”。

这是有效的,我已经测试过了:

template< typename T >
struct vector_builder
{
     mutable std::vector<T> v;
     operator std::vector<T>() const { return v; }
};

template< typename T, typename U >
vector_builder<T>& operator,(vector_builder<T>& vb, U const & u )
{
vb.v.push_back( u );
return vb;
}

struct B
{
  vector<double> v;

};

B b = { (vector_builder(),1.1,2.2,3.3,4.4) };

C c = { {1.1, 2.2 }, {(vector_builder(),1.1,2.2,3.3,4.4)} };

答案 4 :(得分:0)

如果您没有新的C ++ 11初始化语法,则只需使用one of the constructors

    C c = {{1.0, 1.0}, {std::vector<double>(100)}};

上面的矢量有100个元素。没有办法在向量的构造中唯一地初始化每个元素。

你可以......

 double values[] = {1, 2, 3, 4, 5};
 C c = {{1.0, 1.0}, {std::vector<double>(values, values+5)}};

或者如果你总是知道元素的数量使用std :: array,你可以初始化你想要的方式。

答案 5 :(得分:-1)

struct C {
    A a;
    B b;
    C(double ta[2], vector<double> tb) {
        a = A(ta[0],ta[1]);    // or a.x = ta[0]; a.y = ta[1]
        b = tb;
    }
};

然后您可以使用类似

的内容进行初始化
C c = C( {0.0, 0.1} , vector<double> bb(0.0,5) );