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:

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;
}
Mon but est de mettre à jour x au sein de la map.

Je n'ai pas trouver d'autres moyen que de faire le code suivant:

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);
        }
    }    
}
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)?

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.