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?
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++)
{
//...
}
}
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;
}
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;
}
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.
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.
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.
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