
Envoyé par
mima_mine
Bonjour tous le monde
je veux savoir le sens de foreach ?!!
es-ce qu'il est un constructeur ou équivalent de la boucle for ?!! ou autre chose ?
1 2 3 4 5 6 7 8 9 10 11
|
#include <stdlib.h>
void CBXConfig::addSources(QStringList list)
{
foreach(QString s, list) {
if (!m_sources.contains(s))
m_sources += s;
}
} |
Cordialement
A ma connaissance, C++ ne possède pas de mot-clef foreach. C++0x possède bien une boucle for dont la syntaxe est :
for (TYPE var : variable_iterable) expr;
qui exécute expr sur chaque valeur de variable_iterable. Exemple:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
#include <iostream>
void f()
{
int array[] = { 1, 2, 3, 4, 5 };
for (int& x : array)
{
std::cout << "x = " << s << std::endl;
x *= 2;
}
for (int x : array)
{
std::cout << "x' = " << x << std::endl;
}
}
// sortie:
// x = 1
// x = 2
// x = 3
// x = 4
// x = 5
// x' = 2
// x' = 4
// x' = 6
// x' = 8
// x' = 10 |
Bien sûr, ça marche aussi si variable_iterable est un std::vector<> ou un autre conteneur de la librairie standard. Cf C++0x : range-based for.
Il y a aussi une fonction template for_each<> dans <algorithm> - depuis la standardisation de 1998 cette fois. On ne parle plus de C++0x.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
#include <iostream>
#include <algorithm>
struct operation
{
void operator()(int x) { std::cout << "x = " << x << std::endl; }
};
void f()
{
int a[5] = { 1, 2, 3, 4, 5 }
std::vector<int> v(a, a+5);
std::for_each(v.begin(), v.end(), operation());
} |
J'ai cru comprendre que C++0x va améliorer cette fonction - des surcharges supplémentaires ont été proposées. L'une d'entre elle permet d'itérer sur un conteneur complet avec une fonction lambda (attention, ça pique un peu les yeux...):
1 2 3 4 5 6 7 8 9 10 11
|
#include <iostream>
#include <algorithm>
void f()
{
int a[5] = { 1, 2, 3, 4, 5 }
std::vector<int> v(a, a+5);
std::for_each(v, [](int x) { std::cout << "x = " << x << std::endl; });
} |
C'est plus simple à écrire, mais c'est encore loin du range-based for.
Partager