Инициализация вектора структуры в структуре - PullRequest
3 голосов
/ 22 августа 2011

Я знаю, как получить структуру в работающей структуре, но я не могу заставить работать вектор структуры в структуре.

Создание вектора структуры на нормальной основе работает дляпример с:

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» на самом деле был просто примером, а во втором примере это был на самом деле просто пример, который должен показать, как это можно сделать, но мне не кажется очень изящным.

Ответы [ 3 ]

6 голосов
/ 22 августа 2011

Возможно добавить конструктор к 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 голосов
/ 22 августа 2011

В случае 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 тогда лишнее.

2 голосов
/ 22 августа 2011

Ваш вопрос неясен, поэтому я пытаюсь угадать, что вы хотите сделать.Если вы хотите, чтобы эта вещь всегда инициализировалась со 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);

Это даст вам вектор из 100 элементов с именем "foo".

И, конечно, вы можетеобъединить оба примера;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...