Вектор инициализации структур



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

5 ответов:

создать вектор, элемент 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;
}

вы не можете получить доступ к вектору с помощью [ # ], пока элемент не существует в векторе с этим индексом. Этот пример заполняет [ # ], а затем изменяет его позже.

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

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

или

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

они не требуют строительства по умолчанию subject.

вы не можете получить доступ к элементам пустого вектора по индексу.
Всегда проверяйте, что вектор не пуст и индекс действителен при использовании [] оператор on std::vector.
[] не добавляет элементы, если они не существуют, но это вызывает Неопределенное Поведение если индекс неверный.

вы должны создать временный объект вашей структуры, заполнить его и затем добавить его в вектор, используя vector::push_back()

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

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

#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

после просмотра принятого ответа я понял, что если знать размер требуемого вектора, то мы должны использовать цикл для инициализации каждого элемента

но я нашел новое, чтобы сделать это с помощью 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 defualt_subject;
  defualt_subject.name="NONE";
  defualt_subject.marks = 0;
  defualt_subject.credits = 0;

  vector <subject> sub(10,defualt_subject);         // defualt_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;
  } 
}

тогда я думаю, что это хороший способ инициализировать вектор структуры, не так ли?

Comments

    Ничего не найдено.