Вектор инициализации структур
Я хочу знать, как я могу добавить значения в свой вектор структур с помощью метода 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");
Ответы
Ответ 1
Создайте векторный элемент 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;
}
Вы не можете получить доступ к вектору с [#], пока в векторе этого индекса не будет существовать элемент. Этот пример заполняет [#], а затем изменяет его.
Ответ 2
Если вы хотите использовать новый текущий стандарт, вы можете сделать это:
sub.emplace_back ("Math", 70, 0);
или
sub.push_back ({"Math", 70, 0});
Для них не требуется построение по умолчанию subject
.
Ответ 3
Вы не можете получить доступ к элементам пустого вектора по индексу.
Всегда проверяйте, что вектор не пуст, и индекс действителен при использовании оператора []
на std::vector
.
[]
не добавляет элементы, если ни один не существует, но вызывает Undefined Поведение, если индекс недействителен.
Вы должны создать временный объект своей структуры, заполнить его и затем добавить в вектор, используя vector::push_back()
subject subObj;
subObj.name = s1;
sub.push_back(subObj);
Ответ 4
Вы также можете использовать агрегатную инициализацию из фигурного списка инициализации для подобных ситуаций.
#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 в С++ 17. Однако он должен работать с С++ 11 и далее. В С++ 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
Ответ 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;
}
}
Тогда я думаю, что хорошо инициализировать вектор структуры, не так ли?