Czy Można zadeklarować dwie zmienne różnych typów w pętli for?

Czy możliwe jest zadeklarowanie dwóch zmiennych różnych typów w ciele inicjalizacyjnym pętli for W C++?

Na przykład:

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

Definiuje dwie liczby całkowite. Czy Mogę zdefiniować int i char w ciele inicjalizacyjnym? Jak to się robi?

Author: Georg Fritzsche, 2010-04-22

6 answers

Niemożliwe, ale można to zrobić:

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

Lub wyraźnie ograniczyć zakres f i i za pomocą dodatkowych nawiasów:

{
    float f; 
    int i;
    for (i = 0,f = 0.0; i < 5; i++)
    {
       //...
    }
}
 181
Author: MK.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-16 16:02:16

Nie-ale technicznie jest obejście (nie żebym faktycznie z niego korzystał, chyba że będę zmuszony):

for(struct { int a; char b; } s = { 0, 'a' } ; s.a < 5 ; ++s.a) 
{
    std::cout << s.a << " " << s.b << std::endl;
}
 235
Author: Georg Fritzsche,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-22 00:15:42

C++17: powinieneś użyć strukturalnej deklaracji wiążącej. Składnia jest obsługiwana w gcc-7 i clang-4.0 (clang live example). To pozwala nam rozpakować krotkę w taki sposób:

for (auto [i, f, s] = std::tuple{1, 1.0, std::string{"abc"}}; i < N; ++i) {
    // ...
}

C++14: możesz zrobić to samo co C++11 (poniżej) z dodatkiem type-based std::get. Więc zamiast std::get<0>(t) w poniższym przykładzie możesz mieć std::get<int>(t).


C++11: std::make_pair pozwala to zrobić, jak również std::make_tuple dla więcej niż dwóch obiektów.

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

std::make_pair zwróci dwa argumenty w std::pair. Do elementów można uzyskać dostęp za pomocą .first i .second.

Dla więcej niż dwóch obiektów, musisz użyć std::tuple

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

std::make_tuple jest to zmienny szablon, który zbuduje krotkę dowolnej liczby argumentów (z pewnymi ograniczeniami technicznymi oczywiście). Elementy mogą być dostępne za pomocą indeksu z std::get<INDEX>(tuple_object)

Wewnątrz ciał pętli for można łatwo obiekty, choć nadal musisz użyć .first lub std::get dla warunku pętli for i zaktualizować wyrażenie

for (auto t = std::make_tuple(0, std::string("Hello world"), std::vector<int>{});
        std::get<0>(t) < 10;
        ++std::get<0>(t)) {
    auto& i = std::get<0>(t);
    auto& s = std::get<1>(t);
    auto& v = std::get<2>(t);
    std::cout << s << std::endl; // cout Hello world
    v.push_back(i); // add counter value to the vector
}

C++98 I C++03 można jawnie nazwać typy a std::pair. Nie ma jednak standardowego sposobu na uogólnienie tego do więcej niż dwóch typów:

for (std::pair<int, std::string> p(5, "Hello World"); p.first < 10; ++p.first) {
    std::cout << p.second << std::endl;
}
 67
Author: Ryan Haining,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-03 19:47:01

Nie możesz zadeklarować wielu typów podczas inicjalizacji, ale możesz przypisać wiele typów, np.

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

Po prostu zadeklaruj je we własnym zakresie.

 14
Author: zmbush,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-04-22 00:13:49

Zobacz " Czy istnieje sposób na zdefiniowanie zmiennych dwóch typów w pętli for? " dla innego sposobu polegającego na zagnieżdżaniu wielu pętli for. Zaletą drugiego sposobu nad "sztuczką strukturalną" Georga jest to, że it (1) pozwala na połączenie statycznych i niestatycznych zmiennych lokalnych oraz (2) pozwala na posiadanie zmiennych niekopiowalnych. Minusem jest to, że jest znacznie mniej czytelny i może być mniej wydajny.

 1
Author: tgoodhart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:30

Zdefiniuj makro:

#define FOR( typeX,x,valueX,  typeY,y,valueY,  condition, increments) typeX x; typeY y; for(x=valueX,y=valueY;condition;increments)

FOR(int,i,0,  int,f,0.0,  i < 5, i++)
{
  //...
}

Pamiętaj, że zakresy zmiennych nie będą również w pętli for w ten sposób.

 0
Author: Ryan Favale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-19 20:40:47