Iterator-kategorier: input, forward, bidirectional, random
Skeln mellem iterator-kategorierne, og vælg algoritmer, der passer til dem
Iterator-kategorier: input, forward, bidirectional, random er en gratis C++ Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i C++ Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad er en iterator?
En iterator er en generaliseret pointer. Algoritmer arbejder gennem iteratorer, så de kobles fra den underliggende container.
Fem iterator-kategorier
Iteratorer klassificeres efter deres egenskaber:
- Inddata — skrivebeskyttet, ét gennemløb
- Uddata — kun skrivning, ét gennemløb
- Fremad — læsning og skrivning, flere gennemløb
- Tovejs — kan bevæge sig fremad og tilbage
- Tilfældig adgang — kan springe med en heltalsforskydning
Inddata-iteratorer
Læs én gang, gå videre, gentag. Du kan ikke gå tilbage. Eksempel: std::istream_iterator.
std::istream_iterator<int> in(std::cin), end;
while (in != end) {
std::cout << *in << " ";
++in;
}Uddata-iteratorer
Skriver kun. Eksempler: std::ostream_iterator og std::back_inserter.
std::ostream_iterator<int> out(std::cout, " ");
std::vector<int> v = {1, 2, 3};
std::copy(v.begin(), v.end(), out);Fremadrettede iteratorer
Som inddata, men med flere gennemløb — du kan gennemløbe området igen fra samme position. Eksempel: std::forward_list.
Tovejsiteratorer
Fremadrettede iteratorer plus --. Eksempler: std::list, std::map og std::set.
std::list<int> l = {1, 2, 3};
auto it = l.end();
--it; // OK, points to last elementIteratorer med tilfældig adgang
Tovejsiteratorer plus spring: it + n, it - n, it[k], it1 - it2. Eksempler: std::vector, std::deque og rå arrays.
Krav til algoritmer
Hver algoritme angiver den mindste iterator-kategori, den har brug for. std::sort kræver tilfældig adgang; std::find kræver kun inddata.
Iterator-egenskaber
std::iterator_traits<Iter> eksponerer iteratorens værditype, kategori og andre egenskaber på kompileringstidspunktet.
using Category = std::iterator_traits<It>::iterator_category;
using Value = std::iterator_traits<It>::value_type;std::advance og std::distance
Flyt en iterator, eller mål en afstand på en generisk måde. De bruger kategorien til den mest effektive implementering.
auto it = v.begin();
std::advance(it, 5); // efficient on random access, O(n) otherwise
auto d = std::distance(v.begin(), it);Brugerdefinerede iteratorer
Hvis du vil skrive din egen, skal du definere de nødvendige typealiaser og operationer for den kategori, du sigter mod — operator*, operator++, operator== osv.
Iterator-koncepter i C++20
C++20 tilføjede formelle koncepter som std::input_iterator, std::forward_iterator og std::random_access_iterator. De erstatter det ældre mærkebaserede system.
Hurtigt tjek
Hvilken iterator-kategori understøtter udtrykket it + n i konstant tid?
Opsummering
Iteratorer kategoriseres efter egenskaber — inddata, uddata, fremad, tovejs og tilfældig adgang. Algoritmer kræver en bestemt minimumskategori. Vektoriteratorer har tilfældig adgang; iteratorer til lister og maps er tovejsiteratorer.
Lær C++ med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 51
- Lektioner
- 203
Ofte stillede spørgsmål
Er lektionen “Iterator-kategorier: input, forward, bidirectional, random” gratis?
Ja — alle 3 lektioner i læringssporet C++ Academy, inklusive “Iterator-kategorier: input, forward, bidirectional, random”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. C++ Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Iterator-kategorier: input, forward, bidirectional, random”?
Skeln mellem iterator-kategorierne, og vælg algoritmer, der passer til dem Du øver dig i C++ Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C++ Academy?
Der kræves ingen tidligere erfaring. C++ Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.
Hvor lang tid tager lektionen “Iterator-kategorier: input, forward, bidirectional, random”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C++ Academy-lektion?
Ja. Alle C++ Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Iterator-kategorier: input, forward, bidirectional, random
- Almindelige iterator-mønstre: begin, end, advance
- Introduktion til C++20's ranges-bibliotek
- Range-adaptors: views::filter, transform, take