Newsgroup: it.comp.lang.c++
Titolo: Eliminare tutte le occorrenze di elemento in un vector

Salve,
dovrei eliminare le occorrenze di un elemento, ho usato questo codice:
#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> v, t;
    v.push_back("AAA");
    v.push_back("AAA");
    v.push_back("BBB");
    v.push_back("AAA");
    v.push_back("CCC");
    v.push_back("AAA");
    v.push_back("AAA");
    v.push_back("BBB");
    v.push_back("AAA");
    sort(v.begin(), v.end());
    remove(v.begin(), v.end(), "AAA");
    unique_copy(v.begin(), v.end(), back_inserter(t));
   for (int i = 0; i < t.size(); i++)
        std::cout << t[i] << std::endl;
}
Ma l'output � questo:
BBB
CCC
AAA
BBB
CCC 

         std::cout << t[i] << std::endl;
Se esegui queste due righe su "v" dopo ogni istruzione capisci quello 
che succede.
Se il tuo scopo e' fare in modo che "v" contenga:
BBB
CCC
BBB
basta scrivere:
     v.erase(remove(v.begin(), v.end(), "AAA"), v.end());
invece delle tre righe che chiamano "sort", "remove" e "unique_copy".
-- 
Carlo Milanesi
http://digilander.libero.it/carlmila

 invece delle tre righe che chiamano "sort", "remove" e "unique_copy".
Ecco, non sapevo di erase applicabile ad un intervallo, conoscevo solo 
quella applicabile ad un elemento.
Ciao

Ho fatto una modifica e non capisco questo output:
#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> v, t;
    v.push_back("AAA");
    v.push_back("AAA");
    v.push_back("BBB");
    v.push_back("AAA");
    v.push_back("CCC");
    v.push_back("AAA");
    v.push_back("AAA");
    v.push_back("BBB");
    v.push_back("AAA");
    remove(v.begin(), v.end(), "AAA");
    for (int i = 0; i < v.size(); i++)
        std::cout << v[i] << std::endl;
}
Output:
BBB
CCC
BBB
AAA
CCC
AAA
AAA
BBB
AAA
Non li ha messi alla fine, c'� un "BBB" in pi�... che logica usa?

Visto che si parla di vector
se ho vector<T> A, B;
la chiamata:
copy(A.begin(), A.end(), back_inserter(B));
equivale all'assegnamento
A = B ?? 

"Noixe" <no...@TOGLIMIemail.it> ha scritto nel messaggio 
news:4ad0a400$0$821$4faf...@reader5.news.tin.it...
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
int main() {
    std::vector<std::string> v, t;
    v.push_back("AAA");
    v.push_back("AAA");
    v.push_back("BBB");
    v.push_back("AAA");
    v.push_back("CCC");
    v.push_back("AAA");
    v.push_back("AAA");
    v.push_back("BBB");
    v.push_back("AAA");
    std::vector<std::string>::iterator i = std::remove(v.begin(), v.end(), 
"AAA");
    v.erase(i, v.end());
    for (unsigned int i = 0; i < v.size(); i++)
        std::cout << v[i] << std::endl;
}
EMG
--
EMAG Software Homepage:     
http://www.emagsoftware.it
The EMG's ZX-Spectrum Page: 
http://www.emagsoftware.it/spectrum
The Best of Spectrum Games: 
http://www.emagsoftware.it/tbosg
The EMG Music page:         
http://www.emagsoftware.it/emgmusic
 

 }
Si,  Carlo mi ha gi� fatto un esempio con l'uso di erase, ma volevo un 
chiarimento in merito a remove, dato che ho sempre saputo che spostava alla 
fine le occorrenze dell'elemento da rimuovere ma l'output che ottengo non 
sembra seguire questa regola. 

 perche' gli "AAA" sono finiti in fondo.
Ma se la sequenza � inizialmente ordinata, e spostiamo in fondo tutte le 
"AAA", la sequenza dovrebbe ancora rimanere ordinata (a parte gli elementi 
finali).
Non lo sar� lessicograficamente, ma ad esempio tutte le "BBB" saranno 
adiacienti, quindi unique_copy non dovrebbe funzionare comunque?
Oppure il problema � semplicemente che remove oltre a metterli in fondo, 
mescola anche gli altri elementi (e dall'output sembra proprio cosi). 

 non sembra seguire questa regola.
Quello che vedi � il risultato dell'algoritmo utilizzato per spostare gli 
elementi in fondo:
BBB
CCC
BBB
AAA
CCC
AAA
AAA
BBB
AAA
Le uniche due cose che puoi assumere sono che fino al terzo elemento 
compreso ci sono gli elementi rimanenti dopo lo spostamento e dal quarto in 
poi (che � indicato dall'iteratore risultante da remove()) sono da 
cancellare con erase().


 cancellare con erase().
Immaginavo che la motivazione fosse quella, ma volevo esserne sicuro.
Ciao 

 mescola anche gli altri elementi (e dall'output sembra proprio cosi).
Sembra di si :-D