Vectori de structuri — o listă de fișe

Bază~14 min4 pași

De ce contează?

O bibliotecă nu are o singură fișă, ci un sertar întreg cu fișe, în ordine. Vrei fișa a cincea? Numeri până la a cincea și o scoți întreagă, cu toate rubricile ei. Vectorul de structuri e exact acest sertar: o listă numerotată de fișe complete.

Ce este un vector de structuri?

Dacă o structură descrie un singur element (un elev), un vector de structuri ține mulți astfel de elemente, numerotați prin index:

struct Elev {
    string nume;
    int nota;
};

Elev v[100];   // pana la 100 de elevi, fiecare cu nume si nota

v[i] e un Elev întreg. Ca să ajungi la un câmp al lui, adaugi punctul: v[i].nume, v[i].nota.

Observația-cheie

Două niveluri de acces: indexul v[i] alege care fișă, punctul .nota alege care rubrică. Ordinea contează: întâi indexul, apoi câmpul — v[i].nota, nu v.nota[i].

Citire și afișare

Parcurgi vectorul de structuri exact ca pe un vector obișnuit, dar lucrezi cu câmpurile fiecărui element:

#include <iostream>
using namespace std;

struct Elev {
    string nume;
    int nota;
};

int main() {
    int n;
    cin >> n;
    Elev v[100];

    for (int i = 0; i < n; i++) {
        cin >> v[i].nume >> v[i].nota;   // citesc ambele campuri ale elevului i
    }

    for (int i = 0; i < n; i++) {
        cout << v[i].nume << " - " << v[i].nota << "\n";
    }
    return 0;
}

Prelucrări pe câmpuri

Orice statistică se face pe câmpul potrivit. De exemplu, elevul cu nota maximă:

int idxMax = 0;
for (int i = 1; i < n; i++) {
    if (v[i].nota > v[idxMax].nota) idxMax = i;   // compar dupa camp
}
cout << "Cel mai bun: " << v[idxMax].nume << "\n";

Reține indicele, nu doar nota — așa păstrezi legătura cu numele. Asta e puterea structurilor: nota și numele nu se despart niciodată.

De ce e mai bun decât vectori paraleli

Cu doi vectori nume[] și nota[], ca să muți un element trebuie să muți în ambii vectori, sincronizat. Cu un vector de structuri, muți v[i] o singură dată și toate câmpurile lui merg împreună. Mai puține locuri unde poți greși.

Vizual, un vector de structuri (afișând notele, fiecare cu numele dedesubt ca etichetă):

9
7
10
8
Ana
Bogdan
Carmen
Dan
Vector de Elev, afișând câmpul nota; eticheta de jos e câmpul nume al aceluiași element. Indexul alege fișa, punctul alege câmpul.
Greșeli frecvente

Capcane la vectori de structuri:

  • Ordinea greșită a accesului: v.nota[i] nu compilează. Întâi indexul, apoi câmpul: v[i].nota.
  • Vector mare declarat local în main: un Elev v[1000000] pe stivă poate da crash. Declară-l global.
  • Pierzi legătura dintre câmpuri: dacă reții doar nota maximă (int mx), pierzi numele. Reține indicele elementului ca să ai acces la toate câmpurile.
  • Citire incompletă: uiți să citești toate câmpurile (cin >> v[i].nume fără nota) → date eronate la elementele următoare.

Recapitulare

  • Un vector de structuri e o listă numerotată de elemente complete; v[i] e o structură întreagă.
  • Accesezi un câmp cu v[i].camp — întâi indexul (care element), apoi câmpul (care rubrică).
  • Mutând un element se mută toate câmpurile lui odată; reține indicele ca să nu pierzi legătura dintre câmpuri.

Întrebarea 1 / 3

Cum accesezi nota celui de-al treilea elev dintr-un vector `Elev v[100]`?