Frage

Wie alle Werte in einem std::map auf den gleichen Wert setzen, ohne eine Schleife über jeden Wert Iterieren mit?

War es hilfreich?

Lösung

C ++ hat die fill Methode von <algorithm> aber für Karten nicht funktioniert. In der Tat Algorithmus Unterstützung für assoziative Container ist in der Regel nicht gut.

Als Ergebnis erhalten Sie eine interation haben zu verwenden oder einen geeigneten Funktors schreibt mit for_each verwendet werden (aber ich halte dies unnötigen Aufwand sein):

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

Andere Tipps

stieß ich auf das gleiche Problem finde aber, dass der Bereich wieder von boost :: Adapter :: Werten wandelbar ist, so dass es dann mit normalen Algorithmen wie std :: Füllung verwendet werden kann.

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

Die boost :: assign Bibliothek hat alle Arten von netten Dingen, den Inhalt eines Behälters, um zu helfen zu initialisieren. Mein Gedanke, dass dies ausdrücklich durch die Karte Iterieren zu vermeiden, verwendet werden könnte. Leider Karten sind neugierig Tiere schwer initialisiert werden, da die Schlüssel eindeutig sein muss. Unterm Strich ist, dass eine einfache for-Schleife ist wahrscheinlich der beste Weg, um eine Karte zu initialisieren. Es kann nicht super elegant sein, aber es wird die Arbeit getan und ist sofort verständlich von jedermann mit jeder Bekanntschaft mit dem STL.

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

Der Rest dieses Beitrags beschreibt die Reise nahm ich die obige Schlussfolgerung zu erreichen.

Die boost :: assign macht es einfach, eine kleine Anzahl von Werten auf eine Karte zugeordnet werden.

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

oder

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

In Ihrem Fall, in dem Sie die gesamte Karte mit dem gleichen Wert initialisiert werden wollen, gibt es die Dienstprogramme wiederholen und repeat_fun.
So etwas sollte mit einem multimap (ungetestet Code-Schnipsel) arbeitet

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

Wie Konrad Rudolph wie erwähnt, können Sie nicht eine Karte mit dem gleichen genauen Wert initialisieren, da die Schlüssel eindeutig sein muss.

Das macht das Leben viel komplexer (Spaß?). So etwas wie dies vielleicht:

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

Nun, dies ist so komplex, immer, ich glaube, jetzt eine einfache Iteration ist der Weg zu gehen

map <int,string> myMap;
for( int k=0;k<1000;k++)
  myMap.insert(pair<int,string>(k,string("")));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top