Depuis c'est pour memoization, aucune des deux options est une bonne idée.
Pour des récipients uniques de clé, emplace
et insert
(sauf quand insert
est passé un value_type
- qui est, pair<const Key, Value>
) peut inconditionnellement allouer de la mémoire et construire la paire clé-valeur, et ensuite détruire le couple et désallouer la mémoire si la clé existe déjà; ceci est évidemment coûteux si votre clé existe déjà. (Ils doivent le faire car dans le cas général, vous devez construire la clé avant de pouvoir vérifier si elle existe et la clé doit être construite directement à son emplacement final.Cependant, vous voulez également éviter de copier inutilement la clé, donc insérer un value_type
n'est pas bon - le Key
est qualifié de constable et ne peut donc pas être déplacé à partir de value_type
.
Enfin, vous souhaiterez également éviter les recherches supplémentaires. Pas aussi coûteux qu'une allocation de mémoire, mais toujours bon pour l'enregistrer.
Ainsi, nous devons d'abord rechercher la clé, et appeler seulement emplace
si la clé n'est pas dans la carte. En C++ 11, seule la recherche homogène est autorisée, vous devez donc faire une copie de args...
.
map<tuple<Args...>, int> cache;
auto key = std::make_tuple(args...);
auto it = cache.lower_bound(key); // *it is the first element whose key is
// not less than 'key'
if(it != cache.end() && it->first == key) {
// key already in the map, do what you have to do
}
else {
// add new entry, using 'it' as hint and moving 'key' into container.
cache.emplace_hint(it, std::move(key), /* value */);
}
En C++ 14, vous pouvez le faire recherche hétérogène, ce qui signifie que vous pouvez enregistrer la copie lorsque vous avez réellement besoin:
map<tuple<Args...>, int, less<>> cache; // "diamond functor" enables hetergeneous lookup
auto key = std::tie(args...); // this is a tuple<const Args&...> - a tuple of references!
auto it = cache.lower_bound(key); // *it is the first element whose key is
// not less than 'key'
if(it != cache.end() && it->first == key) {
// key already in the map, do what you have to do
}
else {
// add new entry, copying args...
cache.emplace_hint(it, key, /* value */);
}
BTW tuple avec grand objet comme clé de carte est pas une option optimale IMO –
Pouvez-vous en proposer un alors? :) – justHelloWorld
comment dois-je proposer puisque je ne sais pas quel est votre problème du tout. –