Skocz do zawartości

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


henry9x9

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()?

 

 

Link do komentarza
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

Link do komentarza
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.

Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...