std::vector & for_each
-
Ich habe eine Matrix und möchte dieser zur Laufzeit mit for_each vergrößern. Gedacht habe ich mir das wie folgt:
vector<vector<int>> v(10,10); ... for_each(v.begin(), v.end(), resize(20))Am Ende soll eine 20x20 Matrix herauskommen, aber irgendwie habe ich noch nicht ganz durch schaut, was ich an for_each als dritten Parameter übergeben muss.
Vielleicht weiß jemand Rat.
-
typedef std::vector< int > mat_column; typedef std::vector< mat_column > matrix; struct resize : public std::unary_function< void, mat_column > { resize( std::size_t new_size ) : size( new_size ) {} void operator()( mat_column& col ) const { col.resize( size ); } private: std::size_t size; };
-
hey,
das klappt, vielen Dank.
Ist es auch möglich, das als Argument für for_each zu formulieren?
-
So?
for_each(v.begin(), v.end(), resize(20))
-
ich meine, du hast sozusagen etwas gebaut, was mir ermöglicht, den Code so wie im ersten Beitrag aufzurufen.
Ich hatte aber an so etwas wie
for_each(v.begin(), v.end(), ???)gedacht, dass das Beschriebene leistet.
-
Du meinst, ohne den Funktor?
for_each(v.begin(), v.end(), bind2nd( mem_fun_ref<void, vector<int> >( &vector<int>::resize ), 20 ) );Mit boost geht das vermutlich schöner.
-
Ungetestet:
for_each(v.begin(), v.end(), bind2nd(mem_fun_ref(&vector<...>::resize), 20));EDIT4MFK

Mit boost:for_each(v.begin(), v.end(), bind(&vector<...>::resize, _1, 20));
-
Genau so habe ich mir das gedacht. Nur habe ich nicht den Parameter void bei mem_fun_ref angegeben. Was hat der zu bedeuten?
Folgendes geht wieder schief:
vector<vector<bool>> v(10,10); for_each(v.begin(), v.end(), bind2nd( mem_fun_ref<void, vector<bool> >( &vector<bool>::resize ), 20 ) );
-
-
Turing schrieb:
Genau so habe ich mir das gedacht. Nur habe ich nicht den Parameter void bei mem_fun_ref angegeben. Was hat der zu bedeuten?
Die template-Parameter bei mem_fun_ref (siehe mein Beispiel) brauchen eigentlich auch garnicht angegeben zu werden, da sie bei Template-Funktionen hergeleitet werden können.
Folgendes geht wieder schief:
vector<bool> ist ein Spezialfall, leider weiss ich gerade auch keinen Workaround.
-
vector<bool> ist ein Spezialfall, leider weiss ich gerade auch keinen Workaround.
...dann weiß ich ja jetzt, warum meine ursprüngliche Version nicht funktioniert
hat.Habe den Typ von bool auf int abgeändert, intern wird es vermutlich sowieso mindestens als int abgelegt, und folgende Version verwendet:
for_each(v.begin(), v.end(), bind2nd(mem_fun_ref(&vector<int>::resize), 20));Vielen Dank.

-
LordJaxom schrieb:
Die template-Parameter bei mem_fun_ref (siehe mein Beispiel) brauchen eigentlich auch garnicht angegeben zu werden, da sie bei Template-Funktionen hergeleitet werden können.
Genau dafür ist die Funktion da, damit man diesen Hickhack mit mem_fun_ref**_t** nicht hat

-
eine vor-schleife ist viel leichterer zu ferstehen