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.