Suche…


Durchlaufen eines Containers

In C ++ kann das Durchlaufen eines Sequenzcontainers c mithilfe der folgenden Indizes durchgeführt werden:

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

Während diese Schriften einfach sind, unterliegen sie häufigen semantischen Fehlern wie einem falschen Vergleichsoperator oder einer falschen Indizierungsvariablen:

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

Eine Schleife kann auch für alle Container mit Iteratoren mit ähnlichen Nachteilen erreicht werden:

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

In C ++ 11 wurden bereichsbasierte für Schleifen und auto Schlüsselwörter eingeführt, wodurch der Code zu Folgendem werden konnte:

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

Hier sind die einzigen Parameter der Container c und eine Variable x , die den aktuellen Wert enthält. Dies verhindert die zuvor angesprochenen Semantikfehler.

Gemäß dem C ++ 11-Standard entspricht die zugrunde liegende Implementierung:

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

In einer solchen Implementierung ist der Ausdruck auto begin = c.begin(), end = c.end(); Kräfte begin und end als vom selben Typ, während das end niemals inkrementiert oder dereferenziert wird. Die Range-basierte for-Schleife funktioniert also nur für Container, die von einem Paar-Iterator / Iterator definiert werden. Der C ++ 17-Standard mildert diese Einschränkung, indem die Implementierung folgendermaßen geändert wird:

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

begin und end dürfen hier von unterschiedlichen Typen sein, solange sie auf Ungleichheit verglichen werden können. Dies ermöglicht das Durchlaufen mehrerer Container, z. B. eines Containers, der von einem Paar-Iterator / Sentinel definiert wird.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow