Czy możliwe jest zadeklarowanie dwóch zmiennych różnych typów w treści inicjalizacyjnej pętli for w C ++?
Na przykład:
for(int i=0,j=0 ...
definiuje dwie liczby całkowite. Mogę zdefiniować int
a char
w organizmie inicjalizacji? Jak by to było zrobione?
c++
scope
declaration
for-loop
Nathan Osman
źródło
źródło
-std=c++0x
) w formiefor(auto i=0, j=0.0; ...
, ale ta możliwość została usunięta w g ++ - 4.5, aby pokrywać się z tekstami c ++ 0x.Odpowiedzi:
C ++ 17 : Tak! Należy użyć ustrukturyzowanej wiążącej deklaracji . Składnia jest obsługiwana w gcc i clang od lat (od gcc-7 i clang-4.0) ( przykład na żywo clang ). To pozwala nam rozpakować krotkę w następujący sposób:
Powyższe daje ci:
int i
Ustawić1
double f
Ustawić1.0
std::string s
Ustawić"ab"
Upewnij się, że
#include <tuple>
dla tego rodzaju deklaracji.Możesz podać dokładne typy wewnątrz
tuple
, wpisując je wszystkie tak jak jastd::string
, jeśli chcesz nazwać typ. Na przykład:Specyficznym zastosowaniem tego jest iteracja po mapie, uzyskanie klucza i wartości,
Zobacz przykład na żywo tutaj
C ++ 14 : Możesz zrobić to samo co C ++ 11 (poniżej) z dodatkiem opartego na typie
std::get
. Zamiast tegostd::get<0>(t)
w poniższym przykładzie możesz miećstd::get<int>(t)
.C ++ 11 :
std::make_pair
pozwala to zrobić, a takżestd::make_tuple
dla więcej niż dwóch obiektów.std::make_pair
zwróci dwa argumenty wstd::pair
. Dostęp do elementów można uzyskać za pomocą.first
i.second
.W przypadku więcej niż dwóch obiektów musisz użyć
std::tuple
std::make_tuple
to szablon variadic, który zbuduje krotkę dowolnej liczby argumentów (oczywiście z pewnymi ograniczeniami technicznymi). Dostęp do elementów można uzyskać za pomocą indeksu za pomocąstd::get<INDEX>(tuple_object)
W obiektach pętli for można łatwo aliasować obiekty, choć nadal trzeba użyć
.first
lubstd::get
dla warunku pętli for i zaktualizować wyrażenieC ++ 98 i C ++ 03 Możesz jawnie nazwać typy a
std::pair
. Nie ma jednak standardowego sposobu na uogólnienie tego na więcej niż dwa typy:źródło
make_
i pisaćstd::pair(1, 1.0)
.Nie - ale technicznie istnieje obejście (nie żebym go użył, chyba że byłbym zmuszony):
źródło
struct { int a=0; char b='a'; } s;
Niemożliwe, ale możesz zrobić:
Lub wyraźnie ogranicz zakres
f
ii
stosowanie dodatkowych nawiasów:źródło
Nie można zadeklarować wielu typów podczas inicjalizacji, ale można przypisać wiele typów EG
Po prostu zadeklaruj je we własnym zakresie.
źródło
Myślę, że najlepszym podejściem jest odpowiedź Xian .
ale...
# Zagnieżdżone dla pętli
To podejście jest brudne, ale można je rozwiązać we wszystkich wersjach.
więc często używam go w funkcjach makro.
Dodatkowe 1.
Może być również używany do
declare local variables
iinitialize global variables
.Dodatkowe 2.
Dobry przykład: z funkcją makro.
(Jeśli nie można zastosować najlepszego podejścia, ponieważ jest to makro dla pętli)
# Sztuczka z instrukcją If
Jeśli chcesz zainicjować
0
lubnullptr
, możesz użyć tej sztuczki.ale nie polecam tego z powodu trudnego czytania.
i wygląda na błąd.
źródło
Zobacz „ Czy istnieje sposób definiowania zmiennych dwóch typów w pętli for? ”, Aby poznać inny sposób zagnieżdżania wielokrotności pętli for. Zaletą drugiej strony w porównaniu z „sztuczką strukturalną” Georga jest to, że (1) pozwala na połączenie statycznych i niestatycznych zmiennych lokalnych i (2) pozwala mieć zmienne niemożliwe do skopiowania. Minusem jest to, że jest znacznie mniej czytelny i może być mniej wydajny.
źródło
Zdefiniuj makro:
Pamiętaj tylko, że zakresy zmiennych również nie będą znajdować się w pętli for.
źródło
{
i}
.Możesz także użyć jak poniżej w C ++.
źródło