[C++] Вектор инициализации структур



Answers

Если вы хотите использовать новый текущий стандарт, вы можете сделать это:

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

или

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

Для них не требуется построение subject умолчанию.

Question

Я хочу знать, как я могу добавить значения в свой вектор структур с помощью метода 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");



Вы также можете использовать агрегатную инициализацию из скопированного списка инициализации для таких ситуаций.

#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 в расширенном инициализаторе компилятор не сработает при попытке вывести тип.

Вышеуказанное было скомпилировано и протестировано с помощью gcc в c ++ 17. Однако он должен работать с 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




Links