316 votes

Est-il possible de déclarer deux variables de types différents dans une boucle for ?

Est-il possible de déclarer deux variables de types différents dans le corps d'initialisation d'une boucle for en C++ ?

Par exemple :

for(int i=0,j=0 ...

définit deux entiers. Puis-je définir un int et un char dans le corps d'initialisation ? Comment cela se passe-t-il ?

312voto

Georg Fritzsche Points 59185

Non - mais techniquement, il existe une solution de contournement (non pas que je l'utiliserais à moins d'y être contraint) :

for(struct { int a; char b; } s = { 0, 'a' } ; s.a < 5 ; ++s.a) 
{
    std::cout << s.a << " " << s.b << std::endl;
}

250voto

MK. Points 11889

Ce n'est pas possible, mais vous pouvez le faire :

float f;
int i;
for (i = 0,f = 0.0; i < 5; i++)
{
  //...
}

Ou bien, limiter explicitement le champ d'application de f y i en utilisant des supports supplémentaires :

{
    float f; 
    int i;
    for (i = 0,f = 0.0; i < 5; i++)
    {
       //...
    }
}

0 votes

C'est la réponse qui devrait être acceptée, selon l'IMO. Utiliser des liaisons structurées d'un tuple (etc.), juste pour limiter la portée, est très obtus. Il suffit d'utiliser des accolades si vous voulez / devez limiter la portée. C'est leur raison d'être.

235voto

Ryan Haining Points 5355

std::make_pair vous permet de le faire, de même que la méthode C++11 std::make_tuple de le faire avec plus de 2 variables.

for(auto p = std::make_pair(5, "Hello World"); p.first < 10; ++p.first){
    std::cout << p.second << std::endl;
}

std::make_pair retournera les deux arguments dans un std::pair . Les éléments sont accessibles avec .first y .second .

Pour plus de deux variables différentes, vous devrez utiliser un fichier de type std::tuple

for(auto t = std::make_tuple(0, "Heliworld", new std::vector<int>);
        std::get<0>(t) < 10;
        ++std::get<0>(t)){
    std::cout << std::get<1>(t) << std::endl; // cout Heliworld
    std::get<2>(t)->push_back(std::get<0>(t)); // add counter value to the vector
}

std::make_tuple est un modèle variadique qui construira un tuple de n'importe quel nombre d'arguments (avec quelques limitations techniques bien sûr). Les éléments peuvent être accédés par index avec std::get<INDEX>(tuple_object)

8 votes

Si vous utilisez C++17, vous pouvez même laisser tomber l'option make_ et écrire std::pair(1, 1.0) .

1 votes

L'activité de tuple / paire de style C++14 poilu -- tout est bon (probablement, upvoted), mais ça a l'air bizarre :)

4 votes

En bref : oui, c'est possible, mais ce ne sera pas beau à voir.

15voto

zmbush Points 2052

Vous ne pouvez pas déclarer plusieurs types dans l'initialisation, mais vous pouvez assigner à plusieurs types, par exemple.

{
   int i;
   char x;
   for(i = 0, x = 'p'; ...){
      ...
   }
}

Il suffit de les déclarer dans leur propre portée.

0 votes

Mais cela rendra votre indentation très moche.

0voto

tgoodhart Points 1206

Voir " Existe-t-il un moyen de définir des variables de deux types dans une boucle for ? "pour une autre méthode impliquant l'imbrication de plusieurs boucles for. L'avantage de l'autre méthode par rapport au "truc du struct" de Georg est qu'elle (1) vous permet d'avoir un mélange de variables locales statiques et non statiques et (2) elle vous permet d'avoir des variables non copiables. L'inconvénient est qu'elle est beaucoup moins lisible et peut être moins efficace.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X