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 : S�lectionner tout - Visualiser dans une fen�tre � part
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.