Sök…


Looping genom en container

I C ++ kan looping genom en sekvensbehållare c göras med hjälp av index enligt följande:

for(size_t i = 0; i < c.size(); ++i) c[i] = 0;

Även om det är enkelt är sådana skrifter föremål för vanliga semantiska fel, som fel jämförelseoperatör, eller fel indexeringsvariabel:

for(size_t i = 0; i <= c.size(); ++j) c[i] = 0;
                     ^~~~~~~~~~~~~~^

Looping kan också uppnås för alla containrar som använder iteratorer, med liknande nackdelar:

for(iterator it = c.begin(); it != c.end(); ++it) (*it) = 0;

C ++ 11 introducerade områdebaserade för slingor och auto nyckelord, vilket gör att koden blir:

for(auto& x : c) x = 0;

Här är de enda parametrarna behållaren c och en variabel x att hålla det aktuella värdet. Detta förhindrar tidigare påpekade semantikfel.

Enligt C ++ 11-standarden motsvarar den underliggande implementeringen:

for(auto begin = c.begin(), end = c.end(); begin != end; ++begin)
{
    // ...
}

I en sådan implementering kommer uttrycket auto begin = c.begin(), end = c.end(); krafter begin och end att vara av samma typ, medan end aldrig ökas eller heller inte förkortas. Så det områdebaserade för loop fungerar bara för containrar definierade av ett par iterator / iterator. C ++ 17-standarden lindrar denna begränsning genom att ändra implementeringen till:

auto begin = c.begin();
auto end = c.end();
for(; begin != end; ++begin)
{
    // ...
}

Här får begin och end vara av olika slag, så länge de kan jämföras för ojämlikhet. Detta gör det möjligt att slinga igenom fler containrar, t.ex. en behållare definierad av ett par iterator / sentinel.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow