PDA

Visualizza la versione completa : [C++] Uso della funzione list.unique()


freetom
16-08-2009, 19:30
// list::unique
#include <iostream>
#include <cmath>
#include <list>
using namespace std;

int main ()
{
int numeri[]={1,3,5,1,34,1,88,31,55,90};
list<int> mylist (numeri,numeri+10);

mylist.unique();

cout << "mylist contains:";
for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
cout << " " << *it;
cout << endl;

cin.get();
}


In sostanza l'output mi riporta, come se nulla fosse stato richiesto...,
1,3,5,1,34,1,88,31,55,90
ovvero mylist.unique non viene minimamente considerato... :dhò: :oVVoVe:

shodan
16-08-2009, 20:41
Hai letto la documentazione di quella funzione?

freetom
16-08-2009, 21:22
Originariamente inviato da shodan
Hai letto la documentazione di quella funzione?

non ci ho capito molto...

freetom
16-08-2009, 21:37
Originariamente inviato da shodan
Hai letto la documentazione di quella funzione?

Se ho capito bene unique come altre azioni...
in una list funziona solo dopo aver ordinato la lista
in quanto a quest'ultima vi si accede solo dal'inizio o dalla fine... e non per
posizioni intermedie... giusto?

Fatto sta che facendo così:



int numeri[]={1,3,5,1,34,1,88,31,55,90};
list<int> mylist(numeri,numeri+10) ;
mylist.sort();
cout << "mylist contains:";
for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
cout << " " << *it;
cout << endl;

mylist.unique();

cout << "mylist contains:";
for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
cout << " " << *it;
cout << endl;


funziona :)

Grazie della ermeticissima... dritta...

:ciauz:

freetom
16-08-2009, 22:49
Cerco di spiegarmi meglio...



cout << "CONTENUTO COMBINAZIONE TEMPORANEO:\n ";
for (i=0;i<combinazione.size();i++) {
cout << combinazione[i];
}

cout << "\nPress ENTER to continue...\n" << endl;
cin.get();

cout << "\nLISTA CON VALORI COMBINAZIONE UNIVOCI...\n";


int comb[10]={1,3,5,1,34,1,88,31,55,90};
list<int> mylist(comb,comb+numeri) ;
mylist.sort();
cout << "mylist contains:";
for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
cout << " " << *it;
cout << endl;

mylist.unique();

cout << "mylist contains:";
for (list<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
cout << " " << *it;
cout << endl;

cin.get();


Se eseguo questo cod mi stampa correttamente i valori univoci cercati rispetto all'insieme
di 10 elementi noto esemplificato dalla riga:
int comb[10]={1,3,5,1,34,1,88,31,55,90};

Ma se volessi (come avrei necessità) associare.. alla list non un insieme noto di elementi ma
un vector dinamico? Es. combinazione

Ho provato a fare:


int comb[]=combinazione;
list<int> mylist(comb,comb+numeri) ;


Ma ottengo sempre errore...

C'è un modo per fare quanto mi propongo o con list non è possibile?
E se c'è quale sarebbe?

Grazie a tutti/e coloro in ascolto...

:ciauz:

shodan
16-08-2009, 23:21
Originariamente inviato da freetom
Se ho capito bene unique come altre azioni...
in una list funziona solo dopo aver ordinato la lista
in quanto a quest'ultima vi si accede solo dal'inizio o dalla fine... e non per
posizioni intermedie... giusto?


Non proprio. C'è scritto che rimuove gli elementi duplicati a patto che siano adiacenti. Il che avviene se effettui prima un sort degli elementi. Nel primo codice che avevi scritto, gli elementi da rimuovere non erano adiacenti, per quello unique non faceva niente.

2)
Se il riversamento su std::list ti serve solo per quello, puoi usare std::sort() e std::unique() sul vector per rimuovere i valori duplicati.
http://www.cplusplus.com/reference/algorithm/unique/

Però se ho ben capito quello che devi fare, è preferibile usare un std::set per accumulare i valori.
http://www.cplusplus.com/reference/stl/set/
In fase di inserimento scarta automaticamente i valori doppi e in genere li ordina direttamente sempre in fase di inserimento. Per inserire valori c'è la funzione membro insert(), e usa sempre iteratori per accedere ai valori contenuti.
Per capirsi:


int comb[10]={1,3,5,1,34,1,88,31,55,90};
std::set<int> mylist(comb,comb+numeri) ;
cout << "mylist contains:";
for (std::set<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
cout << " " << *it;
cout << endl;

freetom
27-08-2010, 20:03
Originariamente inviato da shodan
Non proprio. C'è scritto che rimuove gli elementi duplicati a patto che siano adiacenti. Il che avviene se effettui prima un sort degli elementi. Nel primo codice che avevi scritto, gli elementi da rimuovere non erano adiacenti, per quello unique non faceva niente.

2)
Se il riversamento su std::list ti serve solo per quello, puoi usare std::sort() e std::unique() sul vector per rimuovere i valori duplicati.
http://www.cplusplus.com/reference/algorithm/unique/

Però se ho ben capito quello che devi fare, è preferibile usare un std::set per accumulare i valori.
http://www.cplusplus.com/reference/stl/set/
In fase di inserimento scarta automaticamente i valori doppi e in genere li ordina direttamente sempre in fase di inserimento. Per inserire valori c'è la funzione membro insert(), e usa sempre iteratori per accedere ai valori contenuti.
Per capirsi:


int comb[10]={1,3,5,1,34,1,88,31,55,90};
std::set<int> mylist(comb,comb+numeri) ;
cout << "mylist contains:";
for (std::set<int>::iterator it=mylist.begin(); it!=mylist.end(); ++it)
cout << " " << *it;
cout << endl;




A me da questo errore...

29 provalist.cpp `set' is not a member of `std'

come ovviarvi?

grazie

:ciauz:

shodan
27-08-2010, 22:41
Forse hai dimenticato di mettere l'header file.

freetom
28-08-2010, 15:05
#include <file>

:confused:

o cosa?

thanks

:ciauz:

MItaly
28-08-2010, 16:51
#include <set>

Loading