2012-03-27 17 views
8

Biorąc pod uwagę następujące wykorzystanie auto:C++ 11 auto i size_type

std::vector<int> v; 
for (auto i = 0; i < v.size(); ++i) { 
    ... 
} 

To byłby idealny dla C++ wydedukować i jak std::vector<int>::size_type, ale jeśli tylko wygląda na inicjatora dla i, to zobaczyć Liczba całkowita. Jaki jest wydedukowany typ i w tym przypadku? Czy to właściwe użycie auto?

+0

Nie wiadomo, co zrobić z "i", nie można tego powiedzieć. –

+0

Nigdy nie wiedziałem, że 'auto' jest używane do wyprowadzenia odpowiedniego typu zmiennej! czy to? –

+3

@ Mr.TAMER Tak, zmieniły swoje znaczenie w C++ 11. –

Odpowiedz

20

Użyj decltype zamiast auto, aby zadeklarować i.

for(decltype(v.size()) i = 0; i < v.size(); ++i) { 
    // ... 
} 

Jeszcze lepiej, użyj iteratorów do iteracji nad wektorem, jak pokazuje odpowiedź @ MarkB.

+3

Albo jeszcze lepiej użyć pętli opartej na zasięgu, jak w odpowiedzi poniżej. – juanchopanza

13

Dlaczego nie rozwiązać problemu z iteratorami? Wtedy problem zniknie:

std::vector<int> v; 
for (auto i = v.begin(); i != v.end(); ++i) { 
    ... 
} 

Jeśli chcesz iteracyjne za pomocą indeksów I pewnie właśnie wyraźnie określają typ: Wiesz co to jest. auto jest używany przede wszystkim do nieznanych lub trudnych do wpisania typów szablonów.

+1

powinien zaczynać się od (v) i kończyć (v) – Klaim

3

otrzymuje typ wyłącznie od inicjalizatora. Nie zwraca się uwagi na inne zastosowania, przynajmniej nie w celu określenia typu zmiennej. Aby zrobić to równie dobrze pod uwagę, decltype jest opcja:

for (decltype(v.size()) i = 0; i < v.size(); ++i) 

lub może być w stanie przepisać pętli, aby przejść do tyłu:

for (auto i = v.size(); i-- != 0;) 

lub, być może uda się uniknąć for pętla całkowicie.

7

Odpowiedź na pytanie "Czy to właściwe użycie funkcji auto?" nie jest z powodów wyjaśnionych w innych odpowiedziach. Dla konkretnego przypadku zapętlenie przez zawartość pojemnika, jesteś najprawdopodobniej lepiej z zakresu oparty na pętli:

const dostępu odniesienia do elementów i jest const int&:

std::vector<int> v; 
for (const auto& i : v) { 
    std::cout << i << "\n"; 
} 

nie- const dostęp odniesienia i jest int&:

std::vector<int> v; 
for (auto& i : v) { 
    ++i; 
    std::cout << i << "\n"; 
} 

dostęp wartość i jest int:

std::vector<int> v; 
for (auto i : v) { 
    ... 
} 

i tak dalej. Działa to również dla macierzy w stylu C.