insertion dans une liste triee

insertion dans une liste triee - C++ - Programmation

Marsh Posté le 03-03-2010 à 17:38:08    

Bonjour,
 
J'ai pas mal d'experience en Java et je me suis mis au C++ recemment. J'essaie donc de retranscrire des concepts connus en Java dans des programmes en C++.
 
Je bloque sur les differents types de Collection proposees en C++. J'ai vu qu'il y avait des vector, des list et autres, j'ai aussi vu comment les trier en surchargeant operator< ou en passant un predicat. (a ce sujet, cette page http://bakura.developpez.com/tutoriel/cpp/tri/ est tres bien redigee)
 
Mais je ne trouve pas comment faire une insertion dans une liste triee.
Concretement, j'ai une liste (std::list<shared_ptr<MyObject>> ).  
Cette liste, je veux pouvoir la recuperer triee, mais je ne veux pas la trier a chaque fois que je la recupere (parce que je la recupere souvent). Je voudrais aussi eviter de la trier a chaque fois que j'ajoute un element (lourdeur pachydermique). Je cherche donc une implementation de Collection triee (a la SortedList en java). L'idee, c'est que, a tout instant, la liste est supposee triee et lorsqu'un element est ajoute a la liste, l'element s'insere a sa place de maniere a conserver le tri (en fonction du critere de comparaison ou d'un predicat).
 
Connaissez-vous un moyen de faire ca? une implementation standard que je ne connaitrais pas?

Reply

Marsh Posté le 03-03-2010 à 17:38:08   

Reply

Marsh Posté le 03-03-2010 à 19:19:27    

soit tu bidouille avec priority_queue, soit tu regarde du coté de boost::multi_index

Reply

Marsh Posté le 04-03-2010 à 10:24:45    

J'ai regarde boost::multi_index mais ca m'a donne l'impression d'utiliser un marteau-pilon pour ecraser une mouche :D
Toutefois, en suivant les liens, je suis tombe sur std::multiset, qui a l'air de faire ce dont j'ai besoin :)

Reply

Marsh Posté le 04-03-2010 à 10:39:49    

ouais multi-index c'ets plsu que géénrique mais trés puissant. multi_set ma l'air pas mal.

Reply

Marsh Posté le 04-03-2010 à 10:53:56    

Un truc du genre :

Code :
  1. taliste.insert(std::lower_bound(taliste.begin(), taliste.end(), nouveautruc), nouveautruc);


Ça irait pas ? (ça insère au bon endroit si la liste est déjà triée, en O(n) )


Message édité par 0x90 le 04-03-2010 à 10:54:08

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 04-03-2010 à 11:35:13    

Je viens de chercher ce qu'est lower_bound et effectivement, ca a l'air pas mal, ca me permettrait de rendre mes interfaces moins barbares
 (pour l'instant, je me traine des std::multiset<shared_ptr<MyClass>,MyClass::MySorter> )
 
 Je vais faire un essai :D

Reply

Marsh Posté le 04-03-2010 à 16:07:21    

ca marche nikel, merci :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed