PDA

View Full Version : [C++] For each


Albitexm
28-05-2010, 17:36
L'istruzione "for each" è anche un'istruzione C++? O solo Basic?
Quale funzione assolve?

shinya
28-05-2010, 18:45
A livello di STL c'è questa:

http://www.cplusplus.com/reference/algorithm/for_each/

Non è parte del linguaggio però, ma di STL.

fero86
28-05-2010, 22:28
L'istruzione "for each" è anche un'istruzione C++? a partire da Visual Studio 2010 e dalle versioni piu recenti del gcc la trovi anche in C++ perché fa parte dell'ultima revisione dello standard del C++. purtroppo peró non la trovi nel MinGW perché il MinGW sta indietro rispetto al gcc originale, quindi non la puoi usare ne' in eclipse CDT ne' in CodeBlocks.


Quale funzione assolve? serve ad iterare sugli array e sugli STL containers senza dover dichiarare la variabile iteratrice, permettendo quindi di ridurre la complessitá degli algoritmi. é molto comoda se usata con la keyword auto, che ti permette di fare inferenza dei tipi. ti mostro la sintassi in questo codice di esempio:
int a[5] = { 1, 2, 3, 4, 5, };
for each (auto i in a) {
cout << i << endl;
}


oppure:

list<int> l;
l.push_back(1);
l.push_back(2);
l.push_back(3);
l.push_back(4);
l.push_back(5);
for each (auto i in l) {
cout << i << endl;
}

non sono sicurissimo che il metodo di list si chiamasse "push_back", non mi va di controllare.

cionci
29-05-2010, 09:15
a partire da Visual Studio 2010 e dalle versioni piu recenti del gcc la trovi anche in C++ perché fa parte dell'ultima revisione dello standard del C++. purtroppo peró non la trovi nel MinGW perché il MinGW sta indietro rispetto al gcc originale, quindi non la puoi usare ne' in eclipse CDT ne' in CodeBlocks.
Veramente non mi risulta che sia presente nello standard del C++ e nemmeno nel GCC.
Il for each che hai scritto tu è una estensione Microsoft introdotta per il managed C++ (anche se funziona anche sul codice unmanaged).
Nello standard C++ c'è il for_each linkato da shinya, che di fatto è una funzione, le cui funzionalità sono state estese ulteriormente in C++0x.

tomminno
29-05-2010, 11:40
Non è parte del linguaggio però, ma di STL.

:confused:
STL = Standard Template Library
Fa parte della libreria standard del C++

shinya
29-05-2010, 11:49
:confused:
STL = Standard Template Library
Fa parte della libreria standard del C++

Si ho capito la tua osservazione. Ma cerca di capire cosa intendevo dire. std::for_each non fa parte della grammatica, è implementata in una libreria.

fero86
29-05-2010, 12:39
Veramente non mi risulta che sia presente nello standard del C++ e nemmeno nel GCC. hai ragione a dire che non é presente nel gcc (ho provato ora e non funziona, anche se mi sa che sbaglio qualcosa perché non mi prende neanche le lambda expressions :confused: ) ma per quanto riguarda lo standard del C++ ci sta, solo che avevo sbagliato la sintassi confondendola con quella del costrutto Microsoft :D
http://en.wikipedia.org/wiki/C%2B%2B0x#Range-based_for-loop

tra l'altro ho provato in Visual Studio 2010 e mi sono accorto che il "for each" ci sta, ma il range-based for loop con la sintassi standard no :stordita:



Nello standard C++ c'è il for_each linkato da shinya, che di fatto è una funzione, le cui funzionalità sono state estese ulteriormente in C++0x. be', ora lo si puó utilizzare con le lambda expressions:

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
int a[5] = { 1, 2, 3, 4, 5, };
for_each(a, a + 5, [] (int i) {
cout << i << endl;
});
return 0;
}


cosi diventa molto comodo.

Albitexm
29-05-2010, 12:52
A livello di STL c'è questa:

http://www.cplusplus.com/reference/algorithm/for_each/

Non è parte del linguaggio però, ma di STL.

Secondo voi, "for each" potrei usarla per sviluppare l'espressione che segue?
:
io ho una variabile int "x" e una char "y".
Voglio compararla con una serie di coppie di variabili int "k" e char "z" come
segue: if (x==k && y==z)
{ }
x e y saranno confrontate con:
k1,z1
k2,z2
kn..,zn..
nota: per K1,k2, ecc.. intendo una variabile int sempre diversa, esempio a,b,c. Variabili diverse e slegate tra loro, non elementi di un vettore. Stessa cosa per la variabile char z.

For each potrebbe essere utile in qalche modo per sviluppare questa porzione di codice?

cionci
29-05-2010, 13:26
be', ora lo si puó utilizzare con le lambda expressions:
Mi riferivo proprio a questo ;)