Newsgroup: it.comp.lang.c++
Titolo: Intersezione

Salve
Ho questo problema: devo costruire due liste di oggetti e trovarne
l'intersezione, quindi prendere una terza lista e farne l'intersezione con
quella trovata prima e cosě via (il numero totale di liste non č noto a
priori...)
Non ho mai usato la libreria standard, ma, seguendo un po' questo newsgroup,
mi sto rendendo conto che sarebbe
utile  (e comodo ) imparare ad usarla.
Pensavo, per le liste di usare il std::vector , ma non ho trovato nessun
modo "preconfezionato" per l'intersezione.
Esiste??
Se si, dove lo trovo/come lo uso???
Se no, avete qualche suggerimento per implementarlo nel mio caso??
Grazie mille.
Gerolamo

Se no, avete qualche suggerimento per implementarlo nel mio caso??
Non credo proprio (spero che Alex faccia sentire presto la sua :) che
ti serva vector, ma set.
Ti ho costruito un programmino (non so quanto sia standard), ma ho
preso spunto da quello che accompagna il C++ Builder, che ti mostra
come calcolare l'interesezione tra due insiemi :
#include <set>
#include <iostream>
using namespace std ;
typedef set<double, less<double>, allocator<double> >
        TInsiemeDouble ;
ostream& operator << (ostream& out, const TInsiemeDouble& s)
{
         copy(s.begin(), s.end(),
ostream_iterator < TInsiemeDouble::value_type, char > (cout," ") ) ;
         return out ;
}
int main( void )
{
    // definisco un primo insieme
    TInsiemeDouble PrimoInsieme ;
    for (int i = 0; i < 10; i++)
        PrimoInsieme.insert(i);
    // ne scrivo gli elementi
    cout << "Primo insieme :" << endl ;
    cout << PrimoInsieme << endl << endl ;
    // definisco un secondo insieme
    TInsiemeDouble SecondoInsieme ;
    for ( int i = 4; i < 20 ; i++ )
        SecondoInsieme.insert( i ) ;
    // ne scrivo gli elementi
    cout << "Secondo insieme :" << endl ;
    cout << SecondoInsieme << endl << endl ;
    // definisco un insieme risultato per le operazioni
    TInsiemeDouble InsiemeRisultato ;
    // calcolo l'intersezione tra i due insiemi
    set_intersection( PrimoInsieme.begin(), PrimoInsieme.end(),
                      SecondoInsieme.begin(), SecondoInsieme.end(),
            inserter( InsiemeRisultato, InsiemeRisultato.begin() ) ) ;
    // scrivo a video il risultato dell'operazione
    cout << "Intersezione :" << endl << InsiemeRisultato << endl ;
    return 0 ;
}
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
-----------------------------------------------------
"There is nothing better for understanding a kangaroo
 than seeing it jump." [D.Grune, C.J.H. Jacobs]
-----------------------------------------------------

 mi sto rendendo conto che sarebbe utile  (e comodo ) imparare ad usarla.
Infatti č uno strumento molto potente.
EMG

 ti serva vector, ma set.
L'algoritmo std::set_intersection() puň essere utilizzato con uno
qualunque dei contenitori della libreria standard, anche quindi con un
vector, a patto che i dati siano ordinati.
EMG

vector, a patto che i dati siano ordinati.
OK, grazie, buono a sapersi :)


 "miaclasse"?
A rigor di termini, no, deve solo essere specializzata la classe
template less<miaclasse>.  Spesso lo si fa definendo un operator<,
ma non e` obbligatorio.  L'importante e` che l'operator() della
less<miaclasse> definisca un 'ordinamento debole'.
Questo e` necessario solo per usare algoritmi (o metodi, come
il metodo sort di std::list) che richiedono il concetto di
confronto, e contenitori come set e map (che sono pure basati
sul confronto).  std::vector, std::list, std::deque, possono
essere tutti istanziati senza bisogno di specializzare less<>
(alcuni vecchi compilatori facevano problemi al riguardo).
Alex

 "miaclasse"?
Mi sembra che l'importante è che i dati siano ordinati con il criterio
standard "<" oppure con un altro criterio che si può fornire come ultimo
parametro alla seconda forma di std::set_intersection().
EMG

less<miaclasse> definisca un 'ordinamento debole'.
Che si intende di perciso per 'ordinamento debole' ?


 wrote in message
news:f2mpjso0bd8bpeu2k...@4ax.com...


 wrote in message
news:8himsr$9tg$1...@serv1.iunet.it...

Un predicato P e` "un ordinamento parziale" se e
solo, se per ogni x, y, z del dominio di P:
    P(x, x) = falso
    P(x, y) implica non P(y, x)
    P(x, y) e P(y, z) implicano P(x, z)
Un ordinamento parziale P e` inoltre un ordinamento debole
stretto se e solo se: detti *Equivalenti secondo P* due
qualsiasi x, y (non necessariamente distinti) tali che
    non P(x, y) e non P(y, x)
questa relazione di "equivalenza secondo P" e` in effetti
un'equivalenza, e specificamente e` transitiva.
Un ordinamento debole stretto P e` inoltre un ordinamento
totale se e solo se la relazione di equivalenza secondo P
e` l'eguaglianza (identita`).
Nulla di difficile per chi abbia la pur minima reminiscenza
di algebre astratte, ma ho visto annebbiarsi gli occhi un
po' prima di questo punto a non pochi "praticoni":-).
Alex

 po' prima di questo punto a non pochi "praticoni":-).
Non infierire, per favore... :-)
EMG

 po' prima di questo punto a non pochi "praticoni":-).
Non e' solo una questione di essere "praticoni": e' anche aver finito di
studiare queste cose circa quindici anni fa e non aver avuto piu'
occasione di "spolverarle".
Qualche tempo fa mi e' capitata tra le mani la mia tesi di laurea; ho
provato a leggiucchiarla e mi sono accorto che non capivo bene quel che
diceva. Eppure ai tempi mi era parsa particolarmente chiara, sigh!
Ciao,
Nicola

 diceva. Eppure ai tempi mi era parsa particolarmente chiara, sigh!
A me, l'ultima volta che ho riletto la mia tesi (pure a suo tempo
premiata come "miglior tesi di ingegneria dell'anno" nell'ambito
di un concorso), ha colpito per la sua *ingenuita`*.  Ci sono un
paio di algoritmi di routing, ancora validi, che sono stati poi
reinventati -- chi ci pensava, allora, a brevettarle, quelle cose?-)
Alex

 sembra che sia un'attivita` intrinsecamente piacevole.
Vero, ma il tempo a disposizione e' poco e bisogna fare delle certe. In
piu', anche la pigrizia vuole la sua parte... :-)
Ciao,
Nicola

diceva. Eppure ai tempi mi era parsa particolarmente chiara, sigh!
Su che cos'era ? sulla fisica delle particelle subatomiche ? :)

No, il titolo era "Rappresentazione di funzioni booleane su reti
neuronali" (allora in Italia si diceva cosi') ed era sostanzialmente una
review di algoritmi per reti neurali che ne valutava le caratteristiche
di convergenza ad un risultato ottimo e di computabilita'.
Ciao,
Nicola

reinventati -- chi ci pensava, allora, a brevettarle, quelle cose?-)
Aleeex !!! a volte mi fai paura !!! :)
Sei un mostro (in senso buono!) ... fattelo dire !!! :)