C++
Parallele Vergleiche von klassischen C ++ - Beispielen, die über C ++ vs C ++ 11 vs C ++ 14 vs C ++ 17 gelöst wurden
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.