Bonjour à tous,
A ma grande stupéfaction, je n'arrive pas à utiliser le range-based for avec une std::map qui a pour clé un std::string et pour valeur un std::set<Foo>.
Foo est construit de la manière suivante:
Mon but est de mettre à jour x au sein de la map.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 struct Foo { Foo() : id(ID++), x(42) {} Foo(const Foo&) = default; Foo(Foo&&) = default; int id; int x; }; bool operator<(const Foo& f1, const Foo& f2) { return f1.id < f2.id; }
Je n'ai pas trouver d'autres moyen que de faire le code suivant:
Le problème de ce code est que je fais de nombreuses copies. Serait-il possible de simplement modifier le contenu de mes objets (Sans changer de conteneur)?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 void modifyMap(std::map<std::string, std::set<Foo>>& mFoo) { for (auto& kv : mFoo) { auto tmp = kv.second; kv.second.clear(); for (auto foo : tmp) { auto tmpFoo = foo; tmpFoo.x = 5; kv.second.insert(tmpFoo); } } }
Merci
Edit: J'ai réussi en utilisant des pointeurs (std::shared_ptr pour être plus précis) mais du coup on perd la notion de droit d'écriture. Si certains ont d'autres idées en utilisant directement les objets, je suis preneur. Je mettrais résolu d'ici 2-3 jours sinon.
Partager