2010-07-22 9 views
0

j'ai une liste de Elemtents d'un type personnalisé:Comment trier std :: Liste <..>

std::list<CDataTransferElement*> m_list; 

La classe est définie comme ceci:

class CDataTransferElement 
{ 
public: 
    CDataTransferElement(void); 
    ~CDataTransferElement(void); 

    CString Name; 
    double PercentValue; 
    double MOLValue; 
    int PhaseIndex; 

}; 

Je x articles dans la m_list Objet, qui doit être trié par la variable PhaseIndex dans un nouvel objet (quel type de jamais). En fin de compte j'ai besoin de x listes des éléments CDataTransferElement où chaque liste a seulement des éléments avec le même PhaseIndex.

Comment faire au mieux?

concernant camelord

Répondre

1

Parcourez votre liste en ajoutant chaque CDataTransferElement à une nouvelle liste stockée dans une carte.

std::map<int,std::list<CDataTransferElement*> > m; 
for(std::list<CDataTransferElement*>::iterator i=m_list.begin(); i!=m_list.end(); ++i) 
{ 
    m[ (*it)->PhaseIndex ].append((*it)); 
} 

Vous pouvez ensuite parcourir la carte pour faire ce que vous voulez avec les nouvelles listes séparées.

for(std::map<int,std::list<CDataTransferElement*> >::iterator it = m.begin(); 
    it!=m.end(); 
    ++it) 
{ 
    do_somthing_with_list(it->first, it->second); 
} 
+1

merci, c'est ce que j'ai cherché! – camelord

+0

Au moins quelqu'un a lu toute la question. – rioki

0

Utilisez l'en-tête

Il fournit std :: sort (std :: iterator commencer, std :: end iterator)

http://www.cppreference.com/wiki/stl/algorithm/sort

+2

Cela permettrait de trier les pointeurs, non? :) –

+0

Vous pouvez fournir un objet de comparaison personnalisé. Mais je pense que ce que le PO veut vraiment, c'est séparer la liste en plusieurs nouvelles listes, pas la trier. –

+0

'std :: sort' nécessite des itérateurs à accès aléatoire, donc ça ne fonctionnera pas avec' std :: list'. 'std :: list' fournit sa propre méthode' sort() '. –

0

Si vous voulez utiliser std :: sort, vous pouvez surcharger l'opérateur < dans votre classe. Je pense que l'utilisation de vecteur plutôt que la liste est beaucoup mieux si vous voulez un accès aléatoire

Questions connexes