Effacer un élément d'un bucket de std::unordered_multimap
Bonjour.
Je galère depuis un moment sur comment effacer un élément spécifique d'un std::unordered_multimap. Je n'ai malheureusement trouvé ma réponse ni dans la documentation, ni sur le net. Je précise que je travaille en C++0x.
Je m'explique: Dans un std::unordered_multimap, lorsque l'on a des collisions sur un index, celles-ci sont mises dans une liste associée à l'index (le bucket). Or j'ai bien trouvé une méthode "erase" qui efface un index et le premier élément du bucket, mais impossible de trouver comment supprimer un élément choisi au sein de ce bucket.
J'ai écrit un exemple minimaliste, qui montre le problème auquel je suis confronté:
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 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| #include <iostream>
#include <unordered_map>
typedef std::unordered_multimap<uint32_t, std::string> hash_type;
namespace
{
void
eraseFromBucket(int key, hash_type& hash, const std::string& element)
{
auto bucket = hash.bucket(key);
auto end = hash.cend(bucket);
for (auto it = hash.cbegin(bucket); it != end; ++it)
{
if (it->second == element)
{
//hash.erase(it); // Je recherche une méthode qui supprime un élement d'un bucket !
std::cout << "Dans le bucket " << it->first << ", supprimer l'element " << it->second << std::endl;
return; // Return, iterators are now invalidated.
}
}
}
void
display(const hash_type& hash)
{
auto end = hash.cend();
for (auto it = hash.cbegin(); it != end; ++it)
std::cout << it->first << " => " << it->second << std::endl;
}
} // namespace
int main()
{
hash_type hash;
hash.insert(hash_type::value_type(1, "toto"));
hash.insert(hash_type::value_type(2, "tutu"));
hash.insert(hash_type::value_type(2, "tata"));
hash.insert(hash_type::value_type(2, "titi"));
std::cout << "Before" << std::endl;
display(hash);
eraseFromBucket(2, hash, "titi");
std::cout << "After" << std::endl;
display(hash);
// auto it = hash.find(2);
// hash.erase(it);
// Supprimera le premier élément du bucket 2, "tutu"
return 0;
} |
Merci.