Iterátory

Iterátor je objekt, který může iterovat prvky v kontejneru standardní knihovny C++ a poskytovat přístup k jednotlivým prvkům. Všechny kontejnery standardní knihovny jazyka C++ poskytují iterátory tak, aby algoritmy měly ke svým prvkům standardní přístup, aniž by se museli obávát typu kontejneru, ve které jsou prvky uložené.

Iterátory můžete použít explicitně pomocí členských a globálních funkcí, jako jsou operátory a, jako je a , k begin()end()++-- přesunu vpřed nebo zpět. Můžete také použít iterátory implicitně se smyčkou range-for nebo (u některých typů iterátoru) operátor dolního indexu [] .

Ve standardní knihovně jazyka C++ je začátek sekvence nebo rozsahu prvním prvkem. Konec sekvence nebo rozsahu je vždy definován jako jeden za posledním prvkem. Globální funkce a beginend návratové iterátory do zadaného kontejneru. Typická explicitní smyčka iterátoru pro všechny prvky v kontejneru vypadá takhle:

vector<int> vec{ 0,1,2,3,4 };
for (auto it = begin(vec); it != end(vec); it++)
{
    // Access element using dereference operator
    cout << *it << " ";
}

Totéž lze provést jednodušeji pomocí smyčky range-for:

for (auto num : vec)
{
    // no dereference operator
    cout << num << " ";
}

Iterátory jsou v pěti kategoriích. V zájmu zvýšení výkonu jsou tyto kategorie:

  • Výstup : Výstupní iterátor může iterovat dopředu přes sekvenci pomocí operátoru a může napsat prvek pouze jednou ++ pomocí * operátoru .

  • Zadejte. Vstupní iterátor může iterovat dopředu přes sekvenci pomocí operátoru a může číst prvek libovolným počtem ++ krát pomocí * operátoru . Vstupní iterátory můžete porovnat pomocí == operátorů != a . Po zvýšení jakékoli kopie vstupního iterátoru není možné bezpečně porovnávat, odkazovat ani zvyšovat žádné další kopie.

  • Předat dál. Dopředný iterátor může iterovat dopředu přes sekvenci pomocí operátoru ++ a může číst libovolný prvek nebo zapisovat nesoučtové prvky libovolný početkrát pomocí * operátoru . K členům elementu můžete přistupovat pomocí -> operátoru a porovnat dopředné iterátory pomocí == operátorů != a . Můžete vytvořit více kopií dopředného iterátoru, z nichž každá může být přes ukazatel a zvýšena nezávisle. Dopředný iterátor, který je inicializován bez odkazu na jakýkoli kontejner, se nazývá dopředný iterátor s hodnotou null. Dopředné iterátory s hodnotou null vždy porovnávají hodnotu rovná se.

  • Obousměrné . Obousměrný iterátor může být místo dopředového iterátoru. Můžete ale také dekrementovat obousměrný iterátor jako v --X , X-- nebo (V = *X--) . Můžete přistupovat ke členům elementu a porovnat obousměrné iterátory stejným způsobem jako dopředné iterátory.

  • Náhodný přístup. Iterátor s náhodným přístupem může být místo obousměrného iterátoru. Pomocí iterátoru s náhodným přístupem můžete pro přístup k prvkům použít operátor [] dolního indexu. Pomocí operátorů , a můžete přesunout zadaný počet prvků dopředu nebo dozadu a vypočítat +- vzdálenost mezi +=-= iterátory. Obousměrné iterátory můžete porovnat pomocí == , , , , a !=<><=>= .

Všechny iterátory lze přiřadit nebo zkopírovat. Předpokládá se, že jsou zjednodušené objekty a často se předá a vrátí hodnotou, nikoli odkazem. Všimněte si také, že žádná z výše popsaných operací nemůže vyvolat výjimku, pokud byla provedena s platným iterátorem.

Hierarchii kategorií iterátoru lze shrnout zobrazením tří sekvencí. Pro přístup k sekvenci jen pro zápis můžete použít kterýkoli z těchto prvků:

výstupní iterátor
– > dopředné iterátor
– > obousměrný iterátor
– > iterátor s náhodným přístupem

Šipka vpravo znamená "může být nahrazena." Jakýkoli algoritmus, který volá výstupní iterátor, by měl fungovat dobře s dopředné iterátoru, například, ale ne naopak.

Pro přístup k sekvenci jen pro čtení můžete použít kterýkoli z těchto prvků:

vstupní iterátor
– > dopředné iterátor
– > obousměrný iterátor
– > iterátor s náhodným přístupem

Vstupní iterátor je v tomto případě nejslabší ze všech kategorií.

Pro přístup ke čtení a zápisu k sekvenci můžete také použít kterýkoli z těchto prvků:

dopředné iterátor
– > obousměrný iterátor
– > iterátor s náhodným přístupem

Ukazatel objektu může vždy sloužit jako iterátor s náhodným přístupem, takže může sloužit jako libovolná kategorie iterátoru, pokud podporuje správný přístup pro čtení a zápis k sekvenci, která určuje.

Iterátor jiný než ukazatel na objekt musí také definovat typy Iterator členů vyžadované specializací iterator_traits<Iterator> . Tyto požadavky lze splnit odvozením z Iterator iterátoru veřejné základní Iterator.

Je důležité porozumět příslibům a omezením každé kategorie iterátoru, abyste viděli, jak kontejnery a algoritmy používají iterátory ve standardní knihovně C++.

Poznámka

Iterátory se můžete vyhnout explicitnímu použití smyček range-for. Další informace najdete v tématu Příkaz for založený na rozsahu.

Microsoft C++ nyní nabízí kontrolované iterátory a ladicí iterátory, aby se zajistilo, že nepřepíšete hranice kontejneru. Další informace najdete v tématu Checked Iterators and Debug Iterator Support.

Viz také

Referenční dokumentace standardní knihovny C++
Bezpečnost vláken ve standardní knihovně C++