Jump to content
Sign in to follow this  
henry9x9

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

Recommended Posts

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

 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...