Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425

    [C++] vector eliminare elementi

    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:
    codice:
    ...
    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":

    codice:
    ...
    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?

    grazie
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  2. #2
    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...



  3. #3
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    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:

    codice:
    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:
    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ì:
    codice:
    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...

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  4. #4
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    perfetto, per la sostituzione delle carte risolto così:
    codice:
    ...
    	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.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  5. #5
    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è! ti da qualke errore di compilazione???


  6. #6
    Originariamente inviato da netarrow
    perfetto, per la sostituzione delle carte risolto così:
    codice:
    ...
    	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.

    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!
    Linguaggi : C/C++
    SO: WinXP, Slack 10

  7. #7
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    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:

    codice:
    //'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
    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  8. #8
    Capito!
    Buon lavoro!

    Io invece sto creando "Uno"!!!

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

    Io sto pensando alle Qt!
    Linguaggi : C/C++
    SO: WinXP, Slack 10

  9. #9
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    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è! ti da qualke errore di compilazione???

    allora e proprio strano 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.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

  10. #10
    Utente di HTML.it L'avatar di netarrow
    Registrato dal
    Apr 2004
    Messaggi
    1,425
    Originariamente inviato da Habdul
    Capito!
    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... ), 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.

    Imparare è un'esperienza, tutto il resto è solo informazione. (Albert Einstein)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.