PDA

Visualizza la versione completa : [C++] vector eliminare elementi


netarrow
02-11-2004, 17:59
salve a tutti
ho un problemino con un vettore in C++, precisamente con l'eliminazione di un elemento, ecco il codice che ho tentato di usare per togliere l'ultimo elemento:


...
vector<Carta> v;
//metto dentro gli elementi con push_back()....
...
//v.back() prendo l'ultimo elemento, ma come lo faccio a far sparire dopo?
//ho provato questo:
v.erase(v.end()-1);


No va, quindi per eliminare l'ultimo ho risolto alla "basta che funzi":



...
int size = 51;
Carta Mazzo::getCard() {
Carta last = v[size];
--size;
return last;
}
...


e mi pu anche andare, per quando devo togliere non l'ultimo, ma l'n-esimo come faccio?

:ciauz: grazie

Oiziorbaf
02-11-2004, 19:29
se intendi cancellare l'ultimo elemento nel senso di ridimensionarlo tipo da 10 a 9 devi fare v.pop_back()....se intendi nel senso di cancellare il valore contenuto allora non posso esserti d'aiuto... :bh:


:ciauz:

netarrow
02-11-2004, 19:46
allora, sto facendo un gioco di poker, il mazzo ha 52 carte quindi il vettore ne avr pure 52, come prendo il 52esimo elemento con v[v.size()-1]il 52esimo non deve esistere pi, ci sar un banalissimo remove come in Java!!? pop_back() ho provato ma con questo codice non funzia, ovvero quando guardo le carte del giocatore sono tutte uguali:



Carta Mazzo::getCard()
{
Carta last = coda[coda.size()-1];
coda.pop_back();
return last;
}


Cmq il problema dell'ultima momentaneamente risolto, ora il problema pi grosso quello del cambio della carta, chiedo il numero di carte da cambiare e faccio un ciclo, per per ogni carta ne chiedo il numero(ogni carta della mano ha un id a seconda della posizione), solo che gli elementi vengono semplicemente spostati in su, ecco il codice:


...
cout << "Inizia il giocatore 1, ecco le tue carte:\n\n";
cout << g1;
int nums;
cout << "\nQuante carte vuoi cambiare?(da 0 a 4)\n";
do {
cin >> nums;
if(!(nums >= 0 && nums < 5)) {
cout << "\nNumero da Da 0 a 4!\n";
}
} while(!(nums >= 0 && nums < 5));
system(PULISCI);
cout << g1;
int count = 0;
int idCard;
while(count < nums) {
cout << "\nInserire numero carta da sostituire\n";
cin >> idCard;
if(idCard < 1 || idCard > 5) {
cout << "\nNon valido\n";
continue;
}
g1.cambia(m.getCard(), idCard-1);
count++;
}
cout << g1;
return 0;
}


cambia agisce cos:


vector<Carta>::iterator I = mano.begin();
mano.insert(I+1, c);


Praticamente la domanda come sostituire un elemento all'indice i da un nuovo elemento

aiuto! sar anche ora di prendersi un libro su 'ste cose...

:ciauz:

netarrow
02-11-2004, 21:16
perfetto, per la sostituzione delle carte risolto cos:


...
vector<Carta>::iterator it = mano.begin() + i;
mano.insert(it, c);
mano.erase(it+1);
...


edit: se qualcuno ora mi spiegasse xh pop_back() non funzia o se ha qualche altra soluzione sarebbe veramente tutto ok.

:ciauz:

Oiziorbaf
03-11-2004, 18:04
strano ke non funzia...ho preso anke il manuale di c++ dove dice ke pop_back() elimina l'ultimo elemento di un vettore e push_back(valore) na aggiunge uno contenente il valore indicato...e questo si usa solo per i vettori...e visto ke il tuo un vettore....non capisco il xk! :bh: ti da qualke errore di compilazione???

:ciauz:

Habdul
04-11-2004, 09:57
Originariamente inviato da netarrow
perfetto, per la sostituzione delle carte risolto cos:


...
vector<Carta>::iterator it = mano.begin() + i;
mano.insert(it, c);
mano.erase(it+1);
...


edit: se qualcuno ora mi spiegasse xh pop_back() non funzia o se ha qualche altra soluzione sarebbe veramente tutto ok.

:ciauz:

cmq se esiste il .begin() c' anche il .end().

Senza che fai quel "+i" che suona brutto!!! Aggiorni ogni volta al nuovo .end()!!! E' molto + leggibile e ottimizzato!

netarrow
04-11-2004, 11:23
Originariamente inviato da Habdul
cmq se esiste il .begin() c' anche il .end().

Senza che fai quel "+i" che suona brutto!!! Aggiorni ogni volta al nuovo .end()!!! E' molto + leggibile e ottimizzato!

Quello il codice per sostituire la carta e funziona cos:
quella 'i' corrisponde all'idCard, ad esempio se io ho 5 carte in mano elencate cos:

1. nomecarta
2. nomecarta
3. nomecarta
4. nomecarta
5. nomecarta

l'utete premendo 2(sarebbe 1 dato che si parte da 0) inserisce prima dell'elemento puntato dall'iteratore alla posizione inizio + id l'ultima carta del mazzo, dopo devo eliminare la carta di prima che sar slittata di una posizione quindi inizio + id + 1. Ecco il codice del metodo completo:



//'c' l'ultima carta del mazzo, i la posizione da cambiare
void Mano::change(Carta c, int i) {
vector<Carta>::iterator it = mano.begin() + i;
mano.insert(it, c);
mano.erase(it+1);
}


Oro provo a capire come far funzionare con .end() l'eliminazione dell'ultima carta del mazzo e se ho problemi posto.

ciao e grazie :ciauz:

Habdul
04-11-2004, 11:26
Capito! :ciauz:
Buon lavoro!

Io invece sto creando "Uno"!!!

Per sapere che librerie grafiche usi per l'interfaccia grafica!

Io sto pensando alle Qt!

netarrow
04-11-2004, 11:28
Originariamente inviato da Oiziorbaf
strano ke non funzia...ho preso anke il manuale di c++ dove dice ke pop_back() elimina l'ultimo elemento di un vettore e push_back(valore) na aggiunge uno contenente il valore indicato...e questo si usa solo per i vettori...e visto ke il tuo un vettore....non capisco il xk! :bh: ti da qualke errore di compilazione???

:ciauz:

allora e proprio strano :confused: non da errori di compilazione ne compilando a debug ne a release, l'unica cosa che non va a run-time, quando guardo le carte del giocatore sono tutte uguali e corrispondono all'ultimo elemento inserito nel vettore.

:ciauz:

netarrow
04-11-2004, 11:31
Originariamente inviato da Habdul
Capito! :ciauz:
Buon lavoro!

Io invece sto creando "Uno"!!!

Per sapere che librerie grafiche usi per l'interfaccia grafica!

Io sto pensando alle Qt!

l'interfaccia grafica di solito l'ultima cosa a cui penso(se non riesco a usare con disinvoltura un vettore... :fagiano: ), ora sto ancora ritoccando UML e abbozzando un po di codice e testandolo a console, funziona tutto ma il codice che uso ... appunto alla "basta che funzi", per per la grafica solitamente uso la api win32.

:ciauz:

Loading