PDA

Visualizza la versione completa : [C++] funzioni push_back su vector di struct


Luke96
15-06-2017, 23:57
Salve a tutti, sto facendo pratica con i vector e sono incappato in un dubbio...

usando la funzione push_back su un normale vector di int funziona normalmente.

Ho provato a modificare il vector in questo modo:

struct prova{
int a;
string b;
}

vector <prova> esperimento (3);

come posso fare ad inserire ad esempio un nuovo nodo del vettore con 3 aaaa?

E' possibile prima di tutto utilizzare la punzione push_back con un vettore di struct? se si come si fa ad accedere ai suoi campi una volta chiamata la funizione per creare un nuovo nodo?
Ringrazio chi potrà darmi una mano:ciauz::ciauz:

shodan
16-06-2017, 00:58
// 1° modo
esperimento.push_back(Prova(3,"aaaa"));

// 2° modo (un po' più moderno)
esperimento.pusk_back(Prova{3,"aaaa"});

// 3° modo per evitare un temporaneo
esperimento.emplace_back(3,"aaaa");

// accedere a un elemento dopo gli inserimenti
esperimento[ indice_valido_compreso_tra_0_e_esperimento.size() ].a = qualcosa;
qualcosa = esperimento[indice_valido_compreso_tra_0_e_esperimento.size() ].a; // idem per b

Luke96
16-06-2017, 16:52
Grazie mille, non ho solo capito cosa eviteresti con il terzo modo.

Luke96
16-06-2017, 17:25
// 1° modo
esperimento.push_back(Prova(3,"aaaa"));

// 2° modo (un po' più moderno)
esperimento.pusk_back(Prova{3,"aaaa"});

// 3° modo per evitare un temporaneo
esperimento.emplace_back(3,"aaaa");

// accedere a un elemento dopo gli inserimenti
esperimento[ indice_valido_compreso_tra_0_e_esperimento.size() ].a = qualcosa;
qualcosa = esperimento[indice_valido_compreso_tra_0_e_esperimento.size() ].a; // idem per b


Altra domanda:; è possibile utilizzare pusk/push_back all' interno di un un ciclo??

Luke96
16-06-2017, 17:34
io ho provato a farla cosi:

struct prova {


int a;
string b;
};


void assegna(vector<prova> vettore, int valore);


int main() {


vector <prova> esperimento(9);
int num = 4;





for (int i = 0; i <esperimento.size(); i++) {

assegna(esperimento, i);
cout << i << ": " << esperimento[i].valore << " " << esperimento[i].seme << endl;

}




}


void assegna(vector<prova> vettore, int valore) {
vettore.push_back(esperimento{ valore,"aaaa" });
}

shodan
16-06-2017, 17:48
Si, ma devi passare il vector per reference altrimenti non porti fuori gli inserimenti.


void assegna(vector<prova>& vettore, int valore) {
vettore.push_back(esperimento{ valore,"aaaa" });
}

Luke96
17-06-2017, 00:49
Ora funziona grazie mille :)

ho un ultimo dubbio poi giuri che la smetto hahahah

ho complicato le cose con questa funzione:
ho un vettore di struct di tipo prova e un puntatore ad una struct prova, se parto ad inserire l indice 0 tutto funzionante ma se invece parto dal mezzo esempio 5 esplode malissimo. Quello che sto cercando di ottenere è di copiare solo i valori passati per quell indice
Sai spiegarmi dove sbaglio?

void funzione_prova int blocco, vector <prova> vettore_finale, prova *vettore_iniziale {
int indice;


for (int y = 0; y < blocco; y++) {
cout << "inserire l'indice della carte che vuoi mettere in tavola" << endl;
cin >> indice;
cout << "sto inserendo: " << vettore_iniziale [indice].valore << endl;
cout << "sto inserendo: " << vettore_iniziale [indice].seme << endl;
vettore_finale.push_back(prova{ vettore_iniziale [indice].valore, vettore_iniziale [indice].seme });
cout << "hai messo nel piatto: " << vettore_iniziale [indice].valore << " " << vettore_iniziale [indice].seme << endl;
cout << "nel piatto: " << vettore_finale[indice].valore << " " << vettore_finale[indice].seme << endl;
}


}

shodan
17-06-2017, 01:00
Stai usando un indice non valido, ossia non compreso nell'intervallo [0 , vector.size()), probabilmente per vettore_finale.
P.S. Cerca di imparare ad usare i tag code altrimenti il codice è quasi illeggibile.

Luke96
21-06-2017, 19:04
grazie infinite, si devo imparare ad usarli :facepalm:
Stai usando un indice non valido, ossia non compreso nell'intervallo [0 , vector.size()), probabilmente per vettore_finale.
P.S. Cerca di imparare ad usare i tag code altrimenti il codice è quasi illeggibile.

Loading