Вектор инициализации структур
Я хочу знать, как я могу добавить значения в вектор структур с помощью 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");
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.
вы не можете получить доступ к элементам пустого вектора по индексу.
Всегда проверяйте, что вектор не пуст и индекс действителен при использовании[]оператор onstd::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