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�:
Merci.
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; }
Partager