Warpten (./20) :
Entre devoir trier un conteneur et passer a un conteneur qui trie a l'insertion, le choix ne se fait pas.
Trier à l'insertion n'est pas forcément le plus efficace. Asymptotiquement, c'est au moins en O(log(n)) par insertion, donc au total, on retrouve le O(n log(n)) du tri séparé. Et si on utilise une fonction
sort, c'est généralement parce qu'on a utilisé une API externe qui retourne des résultats non triés, ou triés différemment de l'ordre dont on a besoin dans l'application. L'insérer dans un conteneur qui trie à l'insertion veut dire recopier tout le contenu du conteneur, donc au final on recode un
sort manuellement, et probablement en moins efficace.
Quand aux foreach...
for (auto const& value : container
Je suis bien au courant. Mais comme déjà écrit, son fonctionnement est optimisé pour les conteneurs STL et n'est pas pratique pour les conteneurs Qt.
Et si tu te plains de l'absence de copie, l'idee c'est qu'en C++ on evite les macros, on n'est pas en C ou on peut se permettre de cacher le fonctionnement d'une macro derriere des directives absolument immondes. Il reste des cas ou c'est necessaire pour eviter de copier-coller comme un malade, mais dans l'ensemble, je prefere copier moi-meme et savoir POURQUOI je copie plutot qu'utiliser des macros qui ne disent pas explicitement le detail de ce qu'elles font et me retrouver avec une utilisation de memoire de cingle parce qu'une macro au nom assez innocent fait un truc que je ne veux pas.
Mais justement, la "copie" d'un conteneur Qt est une shallow copy qui
ne recopie
pas les données, c'est ça la génialité de QtCore! Et c'est au contraire l'utilisation directe de
container, sans le copier dans une variable
const ni même utiliser une référence
const, qui risque de recopier les données (appel de la version non-
const de la méthode
begin()).
Et si t'as besoin d'une copie, auto containerCopy(container) et tu peux iterer dessus...
Il faut au moins
const auto pour que ça fasse ce que je veux, et
qAsConst(container) ou même
static_cast<const auto &>(container) sont plus pratiques comme workarounds. Mais ça reste pourri.
Pour les vecteurs, si tu veux les trier... std::set<T>. Tu perds les valeurs en double, mais des valeurs en double n'ont aucun sens dans un contexte de tri.
Vive
QMultiMap…
