2 svar
105 visningar
paprika_22 behöver inte mer hjälp
paprika_22 60
Postad: 17 aug 20:10

Användning av size_t istället för int

for (std::size_t i = 0; i < v1.size(); ++i) {

for (int k = 0; k < v2[i]; ++k) { ... }}

 

Jag ska i en nestlad for-loop gå igenom vektor v1 samt v2, bägge är av type int. Det jag undrar över är varför man i exemplet ovan väljer att skriva size_t i den yttre loopen, men int i den inre? Skulle jag kunna skriva int även i den yttre loopen?

D4NIEL 2964
Postad: 17 aug 21:01 Redigerad: 17 aug 21:47

size() är en metod (funktion) i vector-containern som returnerar antalet element i vektorn. Resultatet ges som en variabel av typen size_t. Kodsnutten "v1.size()" ger dig alltså längden av vektorn. Det spelar ingen roll om elementen själva är ints eller bananer.

size_t är en osignerad heltalstyp som definieras av standardbiblioteket och är avsedd att representera storleken på objekt i minnet. Det är en implementationstyp, vilket innebär att dess faktiska storlek och representation kan variera beroende på vilken plattform och kompilator du använder. I min specifika miljö (MSVC x64) är size_t = size_type i själva verket en unsigned long long.

Även grundläggande typer som int och long long är implementationsberoende och deras storlek kan skilja sig mellan olika C++-miljöer på olika operativsystem och arkitekturer.

Användningen av size_t kan göra koden mer portabel eftersom den alltid är tillräckligt stor för att rymma storleken på valfritt objekt. Nuförtiden spelar det inte jättestor roll men en int kan i vissa fall (till exempel på äldre datorer) vara 16 bitar lång osignerad, och därmed får din vektor inte vara längre än 0xffffh. Svaret på din egentliga fråga är alltså, ja, du kan använda en int eftersom du förmodligen sitter på en modern dator där int och long long och size_t är ungefär samma sak (förmodligen 64bitar långa).

Så här ser det ut när jag använder min LSP för att ge mig information metoden size():

Och går vi till definitionen (std::vector) ser vi att

Suffixet _t är ett arv från gamla tiders C då man ansåg det viktigt att avsluta aliasnamn med "_t".

Vill vi vara mer exakta med storleken av våra heltal kan vi använda andra alias i <stdint>, till exempel int_32t som ger oss en 32 bitar signed

Laguna Online 30711
Postad: 17 aug 22:32
D4NIEL skrev:

Suffixet _t är ett arv från gamla tiders C då man ansåg det viktigt att avsluta aliasnamn med "_t".

Eller för att man inte ville kladda ner namnrymden för användaren med användbara namn som "size".

Svara
Close