c++ vector struct push-back

c++ - Vector de inicialización de estructuras



push-back (5)

Quiero saber cómo puedo agregar valores a mi vector de estructuras usando el método push_back

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

Entonces, ¿cómo puedo agregarle elementos?

Tengo una función que inicializa el nombre de la cadena (nombre del sujeto)

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); }

Llamada de función

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


Cree un vector, un elemento push_back, luego modifíquelo de la siguiente manera:

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; }

No puede acceder a un vector con [#] hasta que exista un elemento en el vector en ese índice. Este ejemplo rellena el [#] y luego lo modifica después.


Después de mirar la respuesta aceptada, me di cuenta de que si conozco el tamaño del vector requerido, entonces tenemos que usar un bucle para inicializar cada elemento

Pero encontré algo nuevo para hacer esto usando default_structure_element como sigue ...

#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; } }

Entonces creo que es bueno para inicializar un vector de la estructura, ¿no es así?


No puede acceder a los elementos de un vector vacío por subíndice.
Siempre verifique que el vector no esté vacío y el índice sea válido mientras usa el operador [] en std::vector .
[] no agrega elementos si ninguno existe, pero causa un comportamiento indefinido si el índice no es válido.

Debe crear un objeto temporal de su estructura, llenarlo y luego agregarlo al vector, usando vector::push_back()

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


Si desea utilizar el nuevo estándar actual, puede hacerlo:

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

o

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

Estos no requieren la construcción predeterminada del subject .


También puede usar la inicialización agregada de una lista de inicialización preparada para situaciones como estas.

#include <vector> using namespace std; struct subject { string name; int marks; int credits; }; int main() { vector<subject> sub { {"english", 10, 0}, {"math" , 20, 5} }; }

A veces, sin embargo, los miembros de una estructura pueden no ser tan simples, por lo que debe darle una mano al compilador para que deduzca sus tipos.

Así que se extiende en lo de arriba.

#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} }} }; }

Sin la assessment en el inicializador preparado, el compilador fallará al intentar deducir el tipo.

Lo anterior ha sido compilado y probado con gcc en c ++ 17. Sin embargo, debería funcionar desde c ++ 11 en adelante. En c ++ 20 podemos ver la sintaxis del designador, mi esperanza es que permita la siguiente

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

fuente: http://en.cppreference.com/w/cpp/language/aggregate_initialization