【问题标题】:Vector of structs initialization结构初始化向量
【发布时间】:2011-12-25 10:10:32
【问题描述】:

我想知道如何使用push_back 方法向我的结构向量添加值

struct subject
{
  string name;
  int marks;
  int credits;
};


vector<subject> sub;

那么现在我该如何添加元素呢?

我有初始化字符串名称(主题名称)的函数

void setName(string s1, string s2, ...... string s6)
{
   // how can i set name too sub[0].name= "english", sub[1].name = "math" etc

  sub[0].name = s1 // gives segmentation fault; so how do I use push_back method?

  sub.name.push_back(s1);
  sub.name.push_back(s2);
  sub.name.push_back(s3);
  sub.name.push_back(s4);

  sub.name.push_back(s6);

}

函数调用

setName("english", "math", "physics" ... "economics");

【问题讨论】:

标签: c++ vector struct push-back


【解决方案1】:

创建vector,push_back元素,然后修改如下:

struct subject {
    string name;
    int marks;
    int credits;
};


int main() {
    vector<subject> sub;

    //Push back new subject created with default constructor.
    sub.push_back(subject());

    //Vector now has 1 element @ index 0, so modify it.
    sub[0].name = "english";

    //Add a new element if you want another:
    sub.push_back(subject());

    //Modify its name and marks.
    sub[1].name = "math";
    sub[1].marks = 90;
}

您不能使用 [#] 访问向量,直到该索引处的向量中存在一个元素。此示例填充 [#],然后对其进行修改。

【讨论】:

  • subject.resize(2); 可能是一个更快更清晰的解决方案……甚至是vector&lt;subject&gt; sub(2);
  • 是的,我同意。 :) 我认为他不太了解效率的过度分配以及向量如何增长 - 这看起来更像是 C++ 问题的介绍。
  • @w00te 我添加了几个您可能忘记添加的引号。希望没问题。
  • @nims 一切都好! :) 我很惊讶在一个有 25,000 次浏览的问题上出现了 3 年的错误,哈哈。
【解决方案2】:

如果您想使用新的现行标准,您可以这样做:

sub.emplace_back ("Math", 70, 0);

sub.push_back ({"Math", 70, 0});

这些不需要subject 的默认构造。

【讨论】:

  • 你回答的第一部分不准确;如果没有匹配的 ctor rextester.com/VQWCT51042,你不能 emplace_back 结构
【解决方案3】:

对于此类情况,您还可以使用大括号初始化列表中的聚合初始化。

#include <vector>
using namespace std;

struct subject {
    string name;
    int    marks;
    int    credits;
};

int main() {
    vector<subject> sub {
      {"english", 10, 0},
      {"math"   , 20, 5}
    };
}

然而,有时结构的成员可能并不那么简单,因此您必须帮助编译器推断其类型。

所以延伸到上面。

#include <vector>
using namespace std;

struct assessment {
    int   points;
    int   total;
    float percentage;
};

struct subject {
    string name;
    int    marks;
    int    credits;
    vector<assessment> assessments;
};

int main() {
    vector<subject> sub {
      {"english", 10, 0, {
                             assessment{1,3,0.33f},
                             assessment{2,3,0.66f},
                             assessment{3,3,1.00f}
                         }},
      {"math"   , 20, 5, {
                             assessment{2,4,0.50f}
                         }}
    };
}

如果没有大括号初始值设定项中的assessment,编译器将在尝试推断类型时失败。

以上已经在c++17中用gcc编译测试过了。但是,它应该从 c++11 及更高版本开始工作。在 c++20 中我们可能会看到指示符语法,我希望它允许以下

  {"english", 10, 0, .assessments{
                         {1,3,0.33f},
                         {2,3,0.66f},
                         {3,3,1.00f}
                     }},

来源:http://en.cppreference.com/w/cpp/language/aggregate_initialization

【讨论】:

    【解决方案4】:

    您不能通过下标访问空向量的元素。
    std::vector 上使用[] 运算符时,请始终检查向量是否为空且索引是否有效。
    [] 不会在不存在元素时添加元素,但会导致未定义行为 如果索引无效。

    您应该使用vector::push_back()创建结构的临时对象,将其填充,然后将其添加到向量中

    subject subObj;
    subObj.name = s1;
    sub.push_back(subObj);
    

    【讨论】:

      【解决方案5】:

      查看接受的答案后,我意识到如果知道所需向量的大小,那么我们必须使用循环来初始化每个元素

      但我发现新的使用 default_structure_element 来执行此操作,如下所示...

      #include <bits/stdc++.h>
      typedef long long ll;
      using namespace std;
      
      typedef struct subject {
        string name;
        int marks;
        int credits;
      }subject;
      
      int main(){
        subject default_subject;
        default_subject.name="NONE";
        default_subject.marks = 0;
        default_subject.credits = 0;
      
        vector <subject> sub(10,default_subject);         // default_subject to initialize
      
        //to check is it initialised
        for(ll i=0;i<sub.size();i++) {
          cout << sub[i].name << " " << sub[i].marks << " " << sub[i].credits << endl;
        } 
      }
      

      那我觉得初始化一个结构体的向量很好,不是吗?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-06
        • 2011-11-01
        • 2021-08-21
        • 2018-10-18
        • 1970-01-01
        • 2014-03-06
        相关资源
        最近更新 更多