Waarom string::iterator gebruiken in plaats van index?

Mogelijk duplicaat:
Waarom iterators gebruiken in plaats van array-indexen?

string::iterator it;
for (it = str.begin(); it < str.end(); it++) 
    cout << *it;
cout << endl;

Waarom niet:

for (int i = 0; i < str.size(); i++)
    cout << str[i];
cout << endl;

Het lijkt erop dat string::iterator ook geen bereikcontrole biedt. Waarom zouden we string::iteratorgebruiken in plaats van index?

Bedankt.


Antwoord 1, autoriteit 100%

De index kan alleen worden gebruikt voor containers die willekeurige toegang ondersteunen – directe toegang tot een bepaalde positie.

De iterator biedt een uniforme manier om toegang te krijgen tot elke verzameling/gegevensstructuur. De flexibiliteit bij het refactoren van uw code is immens.


Antwoord 2, autoriteit 58%

Iterators zijn een standaardinterface. Door iterators te gebruiken, kunt u dezelfde algoritmen gebruiken met verschillende containers. De uiteindelijke beslissing om ze al dan niet te gebruiken, is aan jou op basis van bruikbaarheid en leesbaarheid.

Bijvoorbeeld het gebruik van het standaard transformatiealgoritme om std::stringom te zetten in hoofdletters:

std::string str = "A String";
std::transform(str.begin(), str.end(), str.begin(), ::toupper);

zal resulteren in dat strgelijk is aan "A STRING".


Antwoord 3, autoriteit 19%

Voor std::string zou ik je aanraden om indexen te gebruiken omdat het Random Access ondersteunt en op die manier eenvoudiger is. De enige reden dat het wordt “aanbevolen” om iterators te gebruiken, is omdat iterators een standaardinterface bieden voor toegang tot reeksen, zodat als uw reeks bijvoorbeeld wordt gewijzigd in std::list, uw iteratiecode niet wordt beïnvloed


Antwoord 4, autoriteit 6%

Duplicaat van:

  1. Iterators.. waarom ze gebruiken?
  2. Waarom iterators gebruiken in plaats van array-indexen?

Dat gezegd hebbende, het is een kwestie van generiek. Je kunt veelmeer doen met iterators die STL gebruiken dan met array-toegang. Als u code moet refactoren en de tekenreeks moet wijzigen in een vector, lijst of touw , je hoeft je code helemaal niet te herschrijven.

Eindelijk is er de kwestie van veiligheid in iteratie. Als je toegang wilt tot het NEXT-teken inje lus, met iterators zou je dat veilig kunnen doen, maar het verhogen van het array-subscript kan een fout in je laatste element opleveren, waardoor er nog een controle nodig is.


Antwoord 5, autoriteit 3%

Zoals vermeld in deze vraag, is de methode size() niet gegarandeerd O(1) zijn


Antwoord 6, autoriteit 3%

In gevallen waarin u niet weet welke klasse u herhaalt (omdat het een template-argument is), moet u een iterator gebruiken, omdat niet elke klasse die een iterator biedt, ook [](en niet elke klas die zich verstrekt [], biedt er een die in O (1) tijd werkt). Dus met behulp van iterator zorgt u ervoor dat de functie werkt met zoveel mogelijk klassen (hoewel niet met C-arrays).

In dit specifieke geval zie ik geen reden om de voorkeur aan de voorkeur aan de voorkeur aan de voorkeur aan de voorkeur aan de voorkeur aan de andere met uitzondering van persoonlijke voorkeur of misschien voortijdige optimalisatie.


Antwoord 7

Beide werken.

De belangrijkste reden zou consistentie zijn: u bent op dezelfde manier over een verzameling of de karakters van een string, door een iterator aan te vragen en het vooruit te maken.

Ik zou niet zeggen dat de implementatiedetails van ++itresulteren in een aanwijzerverhoging in vergelijking met str[i]met aanwijzer rekenkundigen is het vermelden waard. En bereikcontrole zijn ook implementatiedetail.


Antwoord 8

iterators zijn veiliger en bieden meer flexibiliteit zoals het ook gepost door iemand anders. In Additon Een index kan alleen worden gebruikt voor containers die (efficiënt) willekeurig zijn
Toegang
(d.w.z. directe toegang tot een element op een bepaalde positie) .an iterator is een meer algemeen concept. Iterators bieden efficiënte traversal van gekoppelde lijsten, bestanden en een aantal andere gegevensstructuren. Het leidt vaak tot het genereren van efficiënter -code.


Antwoord 9

In C++ kunt u op veel verschillende manieren veel dingen doen. Dit is nog een voorbeeld.
In dit geval is er geen verschil welke methode om te gebruiken. Maar in het algemeen zijn iterators sneller, veiliger en bieden meer flexibiliteit amond verschillende soorten containers.

Other episodes