【问题标题】:Initializing a vector of a struct in a struct在结构体中初始化结构体的向量
【发布时间】:2011-11-01 01:22:03
【问题描述】:

我知道如何让结构中的结构工作,但我无法工作的是结构中结构的向量。

在正常基础上创建一个结构的向量,例如:

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 个成员。您的第二个示例显示将单个元素推入向量。这些不一样。

标签: c++ class vector struct


【解决方案1】:

也许给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);
    

    这将为您提供一个包含 100 个元素的向量,其名称为“foo”。

    当然你也可以把这两个例子结合起来;)

    【讨论】:

      【解决方案3】:

      在 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 是多余的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-25
        • 2011-12-03
        • 2014-02-26
        • 1970-01-01
        相关资源
        最近更新 更多