Dereferenzieren Sie einen Iterator in C++

Zeeshan Afridi 12 Oktober 2023
  1. Was ist ein Iterator in C++
  2. Dereferenzierung in C++
  3. Warum wir einen Iterator in C++ nicht dereferenzieren können
Dereferenzieren Sie einen Iterator in C++

Iteratoren sind ein weiterer leistungsstarker Mechanismus in C++, der Ihnen hilft, komplexe Datenstrukturen wie einen Baum und Mengen zu durchlaufen, in denen wir keine Indizes von Elementen haben, wie z. B. ein Array.

Was ist ein Iterator in C++

In C++ ist ein Iterator ein Objekt wie ein Zeiger, der auf die Elemente innerhalb eines Arrays, einer Liste und jeder anderen Datenstruktur zeigt. Wir verwenden einen Iterator, um die Containerelemente zu iterieren; Obwohl wir die herkömmlichen Schleifen verwenden können, haben Iteratoren die Oberhand beim Durchlaufen eines Containers.

Es bietet einen sehr generischen Ansatz zum Durchlaufen der Elemente eines Containers.

In allgemeinen Datenstrukturen wie Arrays können wir die Indexvariable verwenden, um den Container zu durchlaufen, aber in fortgeschrittenen Datenstrukturen wie einem Baum oder ungeordneten Datenstrukturen, in denen wir die Indexvariable nicht zum Durchlaufen haben, verwenden wir Iteratoren, um sie zu durchlaufen .

Der Container stellt den Iteratoren den Datentyp bereit, und die Containerklasse stellt zwei grundlegende Funktionen bereit, die dem Iterator beim Iterieren durch die Elemente des Containers helfen.

  1. Begin() - gibt das erste Element des Containers zurück.
  2. End() - gibt das vorletzte Element des Containers zurück.

Lassen Sie uns durch ein richtiges Codebeispiel verstehen.

#include <iostream>
#include <vector>
using namespace std;

int main() {
  // Declaring a vector
  vector<int> numbers = {1, 2, 3, 4, 5};

  // Declaring an iterator
  vector<int>::iterator i;

  int j;
  cout << "Traversing using loop = ";

  // Accessing the elements using loops
  for (j = 0; j < 5; ++j) {
    cout << numbers[j] << ", ";
  }

  cout << endl << "Traversing using Iterators = ";

  // Accessing the elements using iterators
  for (i = numbers.begin(); i != numbers.end(); ++i) {
    cout << *i << ", ";
  }

  // Adding another element to the vector
  numbers.push_back(6);

  cout << endl << "Traversing using loops after adding new value to numbers = ";

  // After adding a new value to the numbers vector
  for (j = 0; j < 5; ++j) {
    cout << numbers[j] << ", ";
  }

  cout << endl
       << "Traversing using iterators after adding new value to numbers = ";

  // Accessing the elements using iterators
  for (i = numbers.begin(); i != numbers.end(); ++i) {
    cout << *i << ", ";
  }
  return 0;
}

Ausgang:

Traversing using loop = 1, 2, 3, 4, 5,
Traversing using Iterators = 1, 2, 3, 4, 5,
Traversing using loops after adding new value to numbers = 1, 2, 3, 4, 5,
Traversing using iterators after adding new value to numbers = 1, 2, 3, 4, 5, 6,

Dieses Programm demonstriert den Unterschied zwischen der Verwendung beim Durchlaufen eines Containers mit Schleifen und Iteratoren. Im obigen Code verfolgt der Iterator den Code und übernimmt dynamisch, wenn Änderungen im Code vorgenommen werden.

In Schleifen müssen Sie den Code für Schleifen statisch aktualisieren. Der Iterator erreicht den Wiederverwendbarkeitsfaktor des Codes.

Im Iterator erhält die Funktion begin() das erste Element des Containers und die Funktion end() das vorletzte Element.

Dereferenzierung in C++

Der Dereferenzierungsoperator in C++ wird verwendet, um auf Daten in einem Speicherort, auf den ein Zeiger zeigt, zuzugreifen oder ihn zu manipulieren. Das Sternchensymbol * wird mit der Zeigervariablen verwendet, wenn die Zeigervariable differenziert wird, und es verweist auf eine Variable mit Zeiger, was als Dereferenzierung von Zeigern bezeichnet wird.

Codebeispiel:

#include <iostream>
using namespace std;

int main() {
  int a = 9, b;
  int *p;  // Un-initialized Pointer
  p = &a;  // Store the address of a in pointer p
  b = *p;  // Put the Value  of the pointer p in b
  cout << "The value of a        =   " << a << endl;
  cout << "The value of pointer p =   " << *p << endl;
  cout << "The value of b        =   " << b << endl;
}

Ausgang:

The value of a        =   9
The value of pointer p =   9
The value of b        =   9

Wir weisen a zunächst 9 zu und definieren dann einen Zeiger p. Als nächstes weisen wir die Adresse von a p zu, was ein Zeiger ist, und am Ende weisen wir den Zeiger einer Variablen b vom Integer-Datentyp zu.

Jetzt erhalten a, p und b beim Anzeigen die gleiche Ausgabe wie 9, weil p die Adresse von a hat, was uns hilft, überall den Wert von a anzuzeigen.

Warum wir einen Iterator in C++ nicht dereferenzieren können

In C++ können Sie einen Iterator nicht sofort dereferenzieren, da die Funktion end() einen Iterator und ein Objekt als Zeiger zurückgibt, das kein gültiges Element der Datenstruktur ist.

Wenn Sie am Ende dereferenzieren, wird ein Fehler ausgegeben, da der Zweck des Endzeigers nur darin besteht, zu sehen, wann Sie ihn erreicht haben.

Begin() gibt den Ort zurück, wenn der Container nicht leer ist, mit anderen Worten, um diese Bedingung zu erfüllen.

v.begin() != v.end()  // this condition checks, if the container is empty or not

Wenn Sie jedoch Zugriff auf das letzte Element benötigen, können Sie den folgenden Code verwenden.

vector<object>::const_iterator i = vectorOfObjects.end();
i--;
cout << *i << endl;  // this prints the last element of the container

Zur Erinnerung: Dieser Code funktioniert nur, wenn Ihr Vektor mindestens ein Element enthält.

Codebeispiel:

#include <iostream>
#include <string>
#include <vector>

using namespace std;
struct Student {
  int roll;
  string name;
  int age;
};

int main() {
  Student s1, s2, s3;  // Objects of strucu
  vector<Student> ListOfStudents;

  s1.roll = 1;  // populating the data members of Student
  s2.roll = 2;
  s3.roll = 3;

  s1.name = "Mike";
  s2.name = "John";
  s3.name = "Tom";

  s1.age = 15;
  s2.age = 16;
  s3.age = 14;

  ListOfStudents.push_back(s1);
  ListOfStudents.push_back(s2);
  ListOfStudents.push_back(s3);

  vector<Student>::const_iterator iter =
      ListOfStudents.begin();  // begining position

  while (iter != ListOfStudents.end()) {  // if the container is empty or not
    cout << "Roll number " << iter->roll << " is " << (*iter).name
         << " and he is " << iter->age << " years old." << endl;
    ++iter;
  }
  return 0;
}

Ausgang:

Roll number 1 is Mike and he is 15 years old.
Roll number 2 is John and he is 16 years old.
Roll number 3 is Tom and he is 14 years old.
Zeeshan Afridi avatar Zeeshan Afridi avatar

Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.

LinkedIn

Verwandter Artikel - C++ Iterator