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

3
可能重复:

如何像C数组一样初始化“const std :: vector<T>”?
{{link1:链接1}}

当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选项的情况下完成此操作。

2
你想将它初始化为什么?如果你满意默认构造函数,你根本不需要写任何东西。 - Kerrek SB
根据常见问题解答,一旦您找到了一个合适的答案,您应该接受它(它不必是得票最高的答案)。 - Sebastian Mach
@Buster 如果您想将此问题转移到您的注册帐户,请标记它并要求管理员将您的未注册帐户与您的已注册帐户合并。请确保在标记评论中复制粘贴两个帐户的链接。 - Gilles 'SO- stop being evil'
3个回答

4

只有 C++ 0x 的 std::vector 才有这样的初始化器。在当前的 C++ 中,您必须使用现有的 vector,如下所示...

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

2

好的。谢谢帮忙。我将使用 -std=c++0x 选项来编译 g++,并这样做:pattern_info p = { "", {} }; 这似乎可以工作,并且即使使用 -Wextra -Wall -Weffc++ 编译器也不会产生任何警告。 - Buster Smith

0
如果vector将为空(如您的c++0x示例版本所示),那么,
pattern_info p = { "" };

我认为,甚至可以跳过为std::string加上""的步骤。如果你需要非空字符串,那么只需初始化即可。为了摆脱编译器警告,您可以尝试:

pattern_info p = {};

编辑: 如果你想避免警告,那么提供一个默认构造函数。

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

就按照原样声明:

pattern_info p;

你尝试过这样写吗?pattern_info p = {}; 演示:http://www.ideone.com/wMtsO - iammilind
是的,这会产生两个编译器警告而不是一个。它说字符串和向量都缺少初始化程序。我使用-Wextra编译。当我删除它时,就不会出现编译器警告。但我不想删除-Wextra,因为我很神经质。 - Buster Smith
第一种解决方案会出现编译器警告:成员“pattern_info :: patterns”的初始化程序丢失。 - Buster Smith
只需编写 pattern_info p;。您将获得一个空字符串和一个空向量,因为 pattern_info 的默认构造函数会默认构造非 POD 成员。无需编写构造函数。 - Steve Jessop
@iammilind:由于std :: vector不是POD,它从来没有成为POD。https://dev59.com/bXVC5IYBdhLWcg3w51vy#146589。 - Sebastian Mach
显示剩余2条评论

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