Newsgroup: it.comp.lang.c++
Titolo: problema con list<T>

data la definizione
template<class T, class A> class list;
se volessi usare come tipo di classe una classe definita come
class prova {
private:
    class pippo {
    private:
        int size
    };
    int _id
}
per definire una lista dovrei scrivere list<prova> my_list(5) per contenere
5 elementi (giusto oppure ho già commesso errori? :-))
Il mio problema è come fare per effettuare una ricerca tramite gli algoritmi
generici (ad esempio find() )... se volessi trovare l'elemento della lista
my_list il cui _id sia uguale a 5 come dovrei fare?
qualcuno è così gentile da fornirmi un esempio ed eventuali correzioni?
grazie mille
--
Bruno
aka
San Vegeta from Hell

 ha scritto nel
messaggio news:9flhta$jl9$1...@nreadB.inwind.it...


 Vi prego, aiutatemi, ne ho davvero bisogno :)
Eccoti un esempio funzionante:
#include <iostream>
#include <algorithm>
#include <list>
// Classe degli elementi della lista
class prova
{
    public:
        int GetId() const { return id_; }
        int SetId( int n ) { id_ = n; }
    private:
        class pippo
        {
            private:
                int size;
        };
        int id_;
};
// Oggetto funzione con costruttore per find_if()
class Confronto
{
    public:
        Confronto( int n ): n( n ) {}
        bool operator () ( const prova &p )
        {
            return p.GetId() == n;
        }
    private:
        int n;
};
int main()
{
    std::list < prova > my_list( 5 );
    std::cout << my_list.size() << std::endl;
    int n = 1;
    for ( std::list < prova >::iterator i = my_list.begin(); i !=
my_list.end(); ++i, ++n )
        i -> SetId( n );
    for ( std::list < prova >::iterator i = my_list.begin(); i !=
my_list.end(); ++i, ++n )
        std::cout << i -> GetId() << std::endl;
    std::list < prova >::iterator i = find_if( my_list.begin(),
my_list.end(), Confronto( 5 ) );
    if ( i == my_list.end() )
        std::cout << "Valore non trovato" << std::endl;
    else
        std::cout << i -> GetId() << std::endl;
    return 0;
}
EMG

Eccoti un esempio di uso di list<>
#include <list>
#include <iostream>
#include <algorithm>
using namespace std;
int main( ){
        list<int>       lista;
        int             i=0;
 
        // inserisco i valori
        lista.push_back( 1 );
        lista.push_back( 3 );   
        lista.push_back( 2 );
        lista.push_back( 6 );
 
        // li stampo; e' un esempio di uso degli iteratori      
        for( list<int>::iterator it = lista.begin( ) ; 
                                it != lista.end( );
                                it ++,i++ )
                cout << i << ")\t" << *it << endl;
 
 
        // cerchiamo il 7               
        list<int>::iterator it =
                find( lista.begin( ) , lista.end( ) ,  7 );
 
        if( it == lista.end( ) )
                cout << "Non ho trovato il 7 !" << endl;
        else
                cout << "Ho trovato il 7 !: " << *it << endl;
 
        // cerchiamo il 2
        it=find( lista.begin( ) , lista.end( ) ,  2 );
 
        if( it == lista.end( ) )
                cout << "Non ho trovato il 2 !" << endl;
        else
                cout << "Ho trovato il 2 : " << *it << endl;
        return 0;
}
Ed il suo output
[ghigo@therra /tmp]$ g++ -Wall -ansi -pedantic -o prova prova.cpp
[ghigo@therra /tmp]$ ./prova
0)      1
1)      3
2)      2
3)      6
Non ho trovato il 7 !
Ho trovato il 2 : 2
[ghigo@therra /tmp]$
Per avere maggiori info:
http://www.bruceeckel.com
 : Thinking in C++, volume 2, capitoli 4 e 5 : 
contenitori c++ e algoritmi

 Grazie per il tempo che mi hai donato :)
Non c'è di che. E' servito anche a me come ripasso.
EMG