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++