初始化一个包含向量的结构体

11

我正在寻找一种初始化包含向量的复杂结构的方法,使其能在单行中完成。

例如,如果我有这样一个结构:

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;
};

我必须在单行中完成它,因为我希望我的应用程序用户能够在单个字段中指定所有初始值。当然,我更喜欢标准化的方法而不是自定义的方法。

谢谢!


用户如何指定初始值?如果是配置文件,您可以指定格式并允许单行输入。然后,通过使用多行将其解析为C++中的结构。 - Peter Wood
6个回答

10

在C++中,您可以像在C中一样非常相似地初始化C

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

5
只要您的编译器支持C++11的初始化语法即可。 - Mike Seymour
我不认为这个功能已经被广泛使用。像那样用列表初始化一个vector需要C++11。 - Managu
3
@MikeSeymour - 由于问题没有指定编译器,我认为提问者是在按照标准规范询问有关C ++的问题。 - Mankarse
2
@Mankarse:说得对,但最好指明它只支持C++11;目前还没有编译器完全支持新标准。 - Mike Seymour
@Mankarse 如何知道C++的版本?其次,如果B是这样的:struct B{ vector<A> values;};会怎么样? - Maverik
2
@lucaghera:要知道您编译器的C++版本,请查阅您编译器的文档(对于GCC和Clang,您需要传递-std=c++0x以启用C++11功能)。到目前为止,还没有编译器完全支持C++11。如果B是struct B{vector<A> values;};,那么初始化看起来仍然非常相似:C c{{1.1, 3.2}, {{{1.2, 3.4}, {4.2, 10.3}}}}; - Mankarse

3

如果您没有使用C++11(因此无法使用Mankarse的建议),boost可以帮助:

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

1

如果您没有新的C++11初始化语法,那么您只需要使用其中一个构造函数

    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,您可以按照所需的方式进行初始化。

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)} };

0
你可以这样做:
C obj = { { 0.0, 0.1f }, std::vector<double>( 2, 0.0 ) };

但显然这并不理想,因为向量中的所有值都需要相同。


他只是指定它需要被初始化,而没有设置。哈哈 - L7ColWinters

-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) );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接