Skocz do zawartości
Zaloguj się, aby obserwować  
henry9x9

Typ iterowania dla pętli for - size_t, int, unsigned int

Polecane posty

Kiedyś nie zwracałem na to uwagi, ale od pewnego momentu mam w każdym swoim kodzie ostrzeżenia o tym, że konwertuję nieodpowiedni typ dla wektora, bądź zmiennej w pętli. Chodzi oczywiście o sytuację, jak poniżej:

std::vector < int > A;
/*
        Tutaj dodajemy dane do wektora
*/

for( int i = 0; i < A.size(); ++i ) //(ostrzeżenie: implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'int')
{
    std::cout << A[ i ] << std::endl;
}

Ostrzeżenie jest oczywiście przy zakresie dla pętli for. Mogę zmienić int na size_t, ale wtedy w innej sytuacji, nie mogę wykorzystać zmiennej zakresowej "i" w innym przypadku, aby nie narazić się na to samo ostrzeżenie, tylko w innym miejscu, czyli:

std::vector < int > A;
/*
        Tutaj dodajemy dane do wektora
*/

for( size_t i = 0; i < A.size(); ++i )
{
    std::cout << A[ i ] << std::endl;
    
    
    //tutaj przykładowe przypisanie, gdzie pojawia się ostrzeżenie (ostrzeżenie: implicit conversion loses integer precision: 'size_t' (aka 'unsigned long') to 'int'):
    int tmp = i;
}

Jak poprawnie iterować po wektorach? czy powinno się zawsze używać iteratora? Bądź pętli zakresowej? Jest jakaś "ogólna zasada"? A może nie powinno używać się w pętli iteracyjnej i<wektor.size()?

 

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

int jest 32bitowy, ostrzezenia masz bo kompilujesz na 64bity. size_t jest zależne od platformy.

Drugi przypadek jest dobry, musisz być tylko konsekwetny, jeśli 'i' jest jako size_t, to tmp tez powinno być jako size_t. A jesli jestes swiadom utraty danych dla duzych liczb to musisz powiedziec o tym kompilatorowi robiac rzutowanie: int tmp = (int)i

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

int jest zależny od ustawień kompilatora (może być nawet 16 bitowy). Ostrzeżenie jest bo masz porównanie signed i unsigned. Dodatkowo przy dużych optymalizacjach przy przepełnieniu typu signed (co jest ub) może program zachować się dziwnie. Jeśli masz pewność, że nie będzie przekroczenia zakresów zrób rzutowanie, by pozbyć się ostrzeżenia.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się
Zaloguj się, aby obserwować  

×