web-dev-qa-db-fra.com

Vecteur d'initialisation des structures

Je veux savoir comment ajouter des valeurs à mon vecteur de structures à l'aide de la commande Push_back méthode

struct subject
{
  string name;
  int marks;
  int credits;
};


vector<subject> sub;

Alors maintenant, comment puis-je y ajouter des éléments?

J'ai une fonction qui initialise le nom de la chaîne (nom du sujet)

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

}

Appel de fonction

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

Créez un vecteur, élément Push_back, puis modifiez-le comme suit:

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

Vous ne pouvez pas accéder à un vecteur avec [#] tant qu’un élément n’existe pas dans le vecteur à cet index. Cet exemple remplit le [#] et le modifie ensuite.

79

Si vous souhaitez utiliser la nouvelle norme actuelle, vous pouvez le faire:

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

ou

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

Celles-ci ne nécessitent pas la construction par défaut de subject.

44
Sebastian Mach

Vous ne pouvez pas accéder aux éléments d'un vecteur vide en indice.
Vérifiez toujours que le vecteur n'est pas vide et que l'index est valide lorsque vous utilisez l'opérateur [] Sur std::vector.
[] N'ajoute pas d'éléments s'il n'en existe aucun, mais provoque un comportement non défini si l'index n'est pas valide.

Vous devez créer un objet temporaire de votre structure, le remplir puis l'ajouter au vecteur à l'aide de vector::Push_back()

subject subObj;
subObj.name = s1;
sub.Push_back(subObj);
8
Alok Save

Vous pouvez également utiliser l’initialisation globale à partir d’une liste d’initialisation renforcée pour de telles situations.

#include <vector>
using namespace std;

struct subject {
    string name;
    int    marks;
    int    credits;
};

int main() {
    vector<subject> sub {
      {"english", 10, 0},
      {"math"   , 20, 5}
    };
}

Parfois cependant, les membres d'une structure peuvent ne pas être aussi simples, vous devez donc aider le compilateur à en déduire les types.

Donc, en prolongeant ce qui précède.

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

Sans assessment dans l'initialiseur renforcé, le compilateur échouera lors de la tentative de déduction du type.

Ce qui précède a été compilé et testé avec gcc en c ++ 17. Cela devrait cependant fonctionner à partir de c ++ 11. Dans c ++ 20, nous pouvons voir la syntaxe du désignateur. J'espère que cela permettra:

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

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

6

Après avoir examiné la réponse acceptée, je me suis rendu compte que si nous connaissons la taille du vecteur requis, nous devons utiliser une boucle pour initialiser chaque élément.

Mais j'ai trouvé nouveau de le faire en utilisant default_structure_element comme suit ...

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

Ensuite, je pense que c’est bon d’initialiser un vecteur de la structure, n’est-ce pas?

2
Onk_r