Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    [c++] list.unique che non funziona...

    codice:
    // 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... VVoVe:

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Hai letto la documentazione di quella funzione?
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    si ma...

    Originariamente inviato da shodan
    Hai letto la documentazione di quella funzione?
    non ci ho capito molto...

  4. #4
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    riletta... e forse ho capito e risolto :-)

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

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


  5. #5
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    nuovo problemino: list di elementi non noti in precedenza...

    Cerco di spiegarmi meglio...

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


  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: riletta... e forse ho capito e risolto :-)

    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:
    codice:
    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;
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  7. #7
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    Re: Re: riletta... e forse ho capito e risolto :-)

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


  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Forse hai dimenticato di mettere l'header file.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #9
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    l'header cioè questo...?

    #include <file>



    o cosa?

    thanks


  10. #10
    codice:
    #include <set>
    Amaro C++, il gusto pieno dell'undefined behavior.

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.