在一个结构体中初始化另一个结构体的向量

3

我知道如何使一个结构体中的结构体工作,但我无法让一个结构体中的向量运作。

一般情况下,使用以下代码可以创建一个结构体的向量:

vector<struct> str1(100);

但如果我有以下代码,我该怎么做:

struct attribures {
    string name;
    bool value;
};

struct thing {
    string name;
    double y;
    int x;
    vector<attributes> attrib;
};

如何初始化向量的元素?我可以做的一件事是像下面这样:

attributes a;
objec.attrib.push_back(a); // object is a struct of type thing

但是,那个解决方案对我来说似乎不够优雅。有没有更多类似第一种的方法呢?

编辑:抱歉造成混淆。 "100"实际上只是一个示例,在第二个示例中它也只是一个示例,旨在展示如何完成,但我觉得这种方法并不太优雅。


请澄清:您想做什么? 您的第一个示例显示将向量初始化为具有100个成员。 您的第二个示例显示将单个元素推入向量中。 这些不同。 - Oliver Charlesworth
3个回答

6
也许可以给attributes添加一个构造函数:
struct attributes{
    attributes(const string& name, bool value) : name(name), value(value) {}
    string name;
    bool value;
};

然后:
 object.attrib.push_back(attributes("foo", true));

2

你的问题不是很清楚,所以我试着猜测你想做什么。如果你希望那个东西始终初始化为100个元素,你需要使用构造函数(我还初始化了x和y,因为它们默认为未定义,所以初始化它们是好的):

struct thing {
    string name;
    double y;
    int x;
    vector<attributes> attrib;
    thing() : y(0), x(0), attrib(100) {}

};

如果您想要构建一个具有默认值的100个元素的向量:

attributes a;
a.name = "fOO";
std::vector<attributes> attrib(100, a);

这将为您提供一个名为“foo”的具有100个元素的向量。
当然,您也可以组合这两个示例 ;)

2

在C++0x中,你有几种选择:

#include <vector>
#include <string>    

int main () {
    struct Person {
        Person(std::string const &name, int age) : name (name), age(age) {}
        std::string name;
        int age;
    };

    std::vector<Person> vec { {"John", 24},
                              {"Dani", 32} };

    vec.emplace_back ("Frobster", -2);
    vec.push_back ({"Little unknown rascal", 7});
}

如果您不想编写非默认构造函数,仍然可以执行以下操作:

#include <vector>
#include <string>    

int main () {
    struct Person {
        std::string name;
        int age;
    };

    std::vector<Person> vec { {"John", 24},
                              {"Dani", 32} };

    vec.emplace_back (Person{"Frobster", -2});
    vec.push_back (Person{"Little unknown rascal", 7});
}

尽管emplace_back看起来是多余的。


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