
 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