Voici une ébauche de code qui trie un vector, puis un autre vector sur des références des éléments du premier.
Assez curieusement le tri des références est plus lent de l'ordre d'un bon 15%. J'aurais cru qu'il fasse au moins aussi bien puisque lors du tri les éléments déplacés ne sont jamais que des pointeurs et non pas des instances de structure (qui contient quand même un std::string dans mon exemple).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 struct IdStr { unsigned id; std::string str; friend bool operator<(IdStr const & l, IdStr const & r) noexcept { int cmp = (l.id - r.id); return ((cmp == 0) ? (l.str < r.str) : (cmp < 0)); } }; void main() { std::vector<IdStr> is; // remplir le vector is ... std::sort(is.begin(), is.end()); std::vector<std::reference_wrapper<IdStr>> ris; // re-remplir le vector is ... ris.assign(is.begin(), is.end()); std::sort(ris.begin(), ris.end()); }
En bref, le coût CPU supplémentaire se trouve dans l'appel à la fonction de comparaison (rigoureusement la même dans les deux tris) qui pourtant ne fait qu'une indirection via le pointeur encapsulé dans la référence. Et je suis surpris que la différence soit aussi marquée.
Merci pour vos remarques.