Question

Comment définir toutes les valeurs dans un std::map à la même valeur, sans utiliser de boucle itérant sur chaque valeur ?

Était-ce utile?

La solution

C ++ utilise la méthode fill de <algorithm> mais cela ne fonctionne pas pour les cartes. En fait, la prise en charge des algorithmes pour les conteneurs associatifs n’est généralement pas satisfaisante.

En conséquence, vous devrez utiliser une interaction ou écrire un foncteur approprié à utiliser avec for_each (mais j'estime qu'il s'agit d'une surcharge inutile):

template <typename TKey, typename TValue>
struct resetter : public std::unary_function<std::pair<TKey, TValue> > {
    TValue const value;

    public resetter(value const& v) : value(v) { }

    public void operator ()(std::pair<TKey, TValue>& v) {
        v.second = value;
    }
};

for_each(map.begin(), map.end(), resetter<Key, Value>(value));

Autres conseils

J'ai rencontré le même problème mais j'ai constaté que la plage renvoyée par boost::adaptors::values ​​est mutable, elle peut donc être utilisée avec des algorithmes normaux tels que std::fill.

#include <boost/range/adaptor/map.hpp>
auto my_values = boost::adaptors::values(my_map);
std::fill(my_values.begin(), my_values.end(), 123);

La bibliothèque boost :: assign a toutes sortes de choses utiles pour aider à initialiser le contenu d'un conteneur. Je pensais que cela pourrait être utilisé pour éviter de parcourir explicitement la carte. Malheureusement, les cartes sont des bêtes curieuses difficiles à initialiser car les clés doivent être uniques. En fin de compte, une simple boucle for est probablement le meilleur moyen d'initialiser une carte. Ce n'est peut-être pas très élégant, mais il fait le travail et est immédiatement compréhensible par quiconque ayant une connaissance du STL.

map <int,string> myMap;
for( int k=0;k<1000;k++)
  myMap.insert(pair<int,string>(k,string("")));

Le reste de cet article décrit le chemin que j'ai pris pour parvenir à la conclusion ci-dessus.

Le boost :: assign simplifie l'attribution d'un petit nombre de valeurs à une carte.

map<string,int> m; 
insert( m )( "Bar", 1 )( "Foo", 2 );

ou

 map<int,int> next = map_list_of(1,2)(2,3)(3,4)(4,5)(5,6);

Dans votre cas, lorsque vous souhaitez initialiser l’ensemble de la carte avec la même valeur, il existe les utilitaires repeat et repeat_fun.
Quelque chose comme cela devrait fonctionner avec une carte multiple (extrait de code non testé)

pair<int,string> init( 0,string(""));
multimap <int,string> myMap = repeat(1000,init);

Comme l'a souligné Konrad Rudolph, vous ne pouvez pas initialiser une carte avec la même valeur exacte, car les clés doivent être uniques.

Cela rend la vie beaucoup plus complexe (amusant?). Quelque chose comme ça, peut-être:

map <int,string> myMap;

struct nextkey
{
   int start;
   nextkey( s ) : start( s ) {}
   pair<int,string> operator () ()
{
   return pair<int,string>(start++,string(""));
}
};

myMap = repeat_fun(1000,nextkey(0));

Maintenant, cela devient tellement complexe que je pense maintenant qu’une simple itération est la voie à suivre

<*>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top