如何显式初始化结构的成员向量?

时间:2011-07-25 12:46:13

标签: c++

  

可能重复:
  how-to initialize 'const std::vector<T>' like a c array

当std :: vector是结构的成员时,为std :: vector提供显式初始化器的正确语法是什么?这是结构:

struct pattern_info
    {
        std::string pattern;
        std::vector<std::string> patterns;
    };

以下是我想要初始化它的方法(???是我不确定的部分):

pattern_info p = { "", ??? };

我知道{}会为所有结构成员提供合理的默认值,但我不想这样做。

当我使用-std = c ++ 0x进行编译时,我可以这样做(它似乎有用):

pattern_info p = { "", {} };

我正在使用gcc版本4.4.5(Debian 4.4.5-8),并希望在没有-std = c ++ 0x选项的情况下执行此操作。

3 个答案:

答案 0 :(得分:4)

只有C ++ 0x的std::vector有这样的初始值设定项。在当前的C ++中,您必须使用现有的向量,如...

std::vector<T> foo;
...push_back...push...push...

const std::vector<T> target = foo;

...或使用boost::assign之类的解决方法。

第二种选择是使用std::vector的替代构造函数之一。其中一个是模板并采用输入迭代器范围:

const int foo[] = { 1, 1, 2, 3, 5, 8, 13 };
const std::vector<int> bar (foo, 
                            foo + (sizeof foo / sizeof *foo));

答案 1 :(得分:2)

这只能在C ++ 0x中实现,如前所述。作为替代方案,您可以使用Boost。看一下引言中给出的例子:
&GT; http://www.boost.org/doc/libs/1_39_0/libs/assign/doc/#intro

答案 2 :(得分:0)

如果vector将为空(如c ++ 0x示例版本所示),那么,

pattern_info p = { "" };

我想,您甚至可以跳过""std::string。如果你想要非空字符串,那么只需初始化。要摆脱编译器警告,您可以尝试:

pattern_info p = {};

修改: 如果你想逃避警告,那么提供一个默认的构造函数。

struct pattern_info
{
//...
  pattern_info() : pattern(""), patterns(0) {}
};

并按原样声明:

pattern_info p;