J'essaie de transformer un tableau d'objets en un tableau de pointeurs d'objets, où les pointeurs pointent vers des éléments d'un tableau qui contient tous les objets uniques du premier tableau.
Les objets que j'utilise ne sont pas faciles à copier car ils impliquent l'allocation et la copie de tampons. En revanche, ils sont peu coûteux à déplacer.
Exemple : Le tableau
[G,F,E,G,E,G]
doit être transformé en un tableau d'objets unique
U = [E,F,G] et un tableau de pointeurs
P = [&U[2], &U[1], &U[0], &U[2], &U[0], &U[2]]]
J'utilise actuellement le code suivant pour y parvenir :
int N; // 50 Millions and more
std::vector<MyObj> objarray; // N elements
std::vector<MyObj*> ptrarray; // N elements
...
std::vector<MyObj> tmp(objarray.begin(), objarray.end());
std::sort(objarray.begin(), objarray.end());
auto unique_end = std::unique(objarray.begin(), objarray.end());
// now, [objarray.begin(), unique_end) contains all unique objects
std::map<MyObj, int> indexmap;
// save index for each unique object
int index = 0;
for(auto it = objarray.begin(); it != uniqueend; it++){
indexmap[*it] = index;
index++;
}
//for each object in original array, look up index in unique object array and save the pointer
for(int i = 0; i < N; i++)
ptrarray[i] = &objarray[indexmap[tmp[i]]];
Existe-t-il un moyen plus efficace d'y parvenir, éventuellement sans créer une copie du tableau original puisque les copies d'objets sont coûteuses ?