Ein Leitfaden für Anfänger zur Standardvorlagenbibliothek in C++

C++ ist eine der mächtigsten und einschüchterndsten Programmiersprachen, die Ihnen als Anfänger begegnen könnten. Der Grund ist ziemlich einfach. Es erfordert viel Code, um die gewünschte Ausgabe zu erzielen. Die Standardvorlagenbibliothek (STL) kann Ihnen helfen, dieses Rätsel zu lösen.

Angesichts des Zeit- und Arbeitsaufwands beim Schreiben von Code für Funktionen wie Sortieren und Suchen kann STL Ihnen dabei helfen, all diese Vorgänge mit nur einer einzigen Codezeile auszuführen. Diese Bibliothek kann für die Problemlösung und die Vorbereitung von technischen Interviews sehr nützlich sein.

Was ist die Standardvorlagenbibliothek?

Die Standard Template Library (STL) ist eine C++-Bibliothek, die aus vorgefertigten Funktionen und Containern besteht. Es enthält einige prominente Vorlagenklassen für gängige Datenstrukturen wie Vektoren, Stapel, Warteschlangen und einige praktische algorithmische Funktionen wie die binäre Suche, um die Programmierung zu vereinfachen.

Die Standard Template Library in C++ besteht aus vier Komponenten:

  1. Algorithmen
  2. Behälter
  3. Funktionen
  4. Iteratoren

Schauen wir uns die Algorithmen und Container genauer an, da dies die am häufigsten verwendeten Komponenten der STL sind.

Algorithmen in STL

Die Headerdatei <algorithm> ist ein Teil der STL, die aus mehreren algorithmischen Funktionen besteht, die verwendet werden können, anstatt sie manuell zu codieren. Einige der enthaltenen Algorithmen sind binäre Suche, Sortierung und Umkehrung, die äußerst nützlich sind.

Zunächst müssen Sie den Header <algorithm> in Ihre C++-Datei importieren. Die Syntax lautet wie folgt:

 #include <algorithm>

Betrachten Sie für die kommenden Methoden als Beispiel eine Array-Variable mit den Werten {6, 2, 9, 1, 4}.

 int arr[] = {6, 2, 9, 1, 4};

Sortieren()

Die Funktion sort() hilft Ihnen, alle Elemente innerhalb der angegebenen Datenstruktur in aufsteigender Reihenfolge zu sortieren. Diese Funktion benötigt zwei Parameter: den Start-Iterator und den End-Iterator.

Verwandte: Eine Einführung in den Merge-Sortieralgorithmus

Syntax:

 sort(start_iterator, end_iterator);

Hier ist ein kurzes Beispiel:

 sort(arr, arr+5);
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

Ausgabe:

 1 2 4 6 9

umkehren()

Die Funktion reverse() kehrt die Reihenfolge der Elemente in der angegebenen Datenstruktur um. Es akzeptiert zwei Parameter: den Start-Iterator und den End-Iterator.

Syntax:

 reverse(start_iterator, end_iterator);

Hier ist ein kurzes Beispiel für die obige Methode:

 reverse(arr, arr+5);
for(int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

Ausgabe:

 4 1 9 2 6

*min_element() und *max_element()

Die Funktionen *max_element() und *min_element() geben jeweils den Maximal- und Minimalwert innerhalb der angegebenen Datenstruktur zurück. Beide Funktionen akzeptieren zwei Argumente: den Startiterator und den Enditerator.

Syntax:

 *max_element(start_iterator, end_iterator);
*min_element(start_iterator, end_iterator);

Lassen Sie uns herausfinden, welche Werte diese Funktionen beim Aufrufen im Beispielarray zurückgeben:

 cout << *max_element(arr, arr+5) << endl;
cout << *min_element(arr, arr+5) << endl;

Ausgabe:

 9
1

Die Methode binary_search() wird verwendet, um herauszufinden, ob der angegebene Wert in der Datenstruktur vorhanden ist oder nicht. Es akzeptiert drei Argumente: den Start-Iterator, den End-Iterator und den Wert, den Sie suchen möchten.

Die binäre Suche funktioniert nur bei sortierten Datenstrukturen. Daher müssen Sie zuerst die Methode sort() vor der Methode binary_search() aufrufen.

Syntax:

 binary_search(start_iterator, end_iterator, value_to_find)

Hier ist eine Demonstration dieser Methode:

 sort(arr, arr+5);
binary_search(arr, arr+5, 2) ? cout << "Element found" : cout << "Element not found";
binary_search(arr, arr+5, 7) ? cout << "Element found" : cout << "Element not found";

Ausgabe:

 Element found
Element not found

Anzahl()

Die Methode count() gibt die Anzahl des Auftretens des angegebenen Werts innerhalb der Datenstruktur zurück. Es braucht drei Argumente: den Start-Iterator, den End-Iterator und den zu zählenden Wert.

Syntax:

 count(start_iterator, end_iterator, value_to_count);

Hier ist ein Beispiel für diese Methode:

 cout << count(arr, arr+5, 2) << endl;

Ausgabe:

 1

Container in STL

Container sind die Datenstrukturen, die Objekte und Daten speichern. Vektoren, Listen, Stacks, Queues, Sets und Maps sind einige der Beispiele, in denen Daten gemäß dem angegebenen primitiven Datentyp gespeichert werden. Sie können diese Container verwenden, indem Sie ihre jeweiligen Header in die C++-Datei importieren.

Beim Initialisieren der Containervariablen müssen Sie die primitiven Daten wie int , char , string in den <>- Klammern erwähnen.

Sehen wir uns einige dieser Container genauer an:

Vektor

Vektoren sind dynamische Arrays, die in der Größe veränderbar und flexibel zu bearbeiten sind. Wenn Sie ein Element aus dem Vektor einfügen oder daraus löschen, wird die Größe des Vektors automatisch angepasst. Dies ähnelt der ArrayList-Datenstruktur in Java.

Syntax:

 #include <vector>
vector<data_type> variable_name;

Hier sind einige wichtige Vektormethoden:

  1. push_back(value) : Diese Methode hängt die Daten an den Vektor an.
  2. pop_back() : Diese Methode entfernt das letzte Element aus dem Vektor.
  3. insert(index, value) : Diese Methode fügt neue Elemente vor dem Element an der angegebenen Position ein.
  4. size() : Diese Methode gibt die Größe des Vektors zurück.
  5. empty() : Diese Methode prüft, ob der Vektor leer ist oder nicht.
  6. front() : Diese Methode gibt den ersten Wert des Vektors zurück.
  7. back() : Die Methode back gibt den letzten Wert des Vektors zurück.
  8. at(index) : Diese Methode gibt den Wert an der angegebenen Position zurück.
  9. delete(index) : Die Methode delete entfernt Elemente aus dem angegebenen Index.
  10. clear() : Diese Methode löscht alle Elemente im Vektor.
 vector < int > v = { 23, 12, 56, 10 };
v.push_back(5);
v.push_back(25);
v.pop_back();
auto i = v.insert(v.begin() + 1, 7);
cout << "The size of the given vector " << v.size() << endl;
if (v.empty()) {
cout << "Vector is empty" << endl;
} else {
cout << "Vector is not empty" << endl;
}
cout << "Element at the first position is " << v.front() << endl;
cout << "Element at the last position is " << v.back() << endl;
cout << "Element at the given position is " << v.at(4) << endl;
v.erase(v.begin() + 1);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}

Ausgabe:

 The size of the given vector 6
Vector is not empty
Element at the first position is 23
Element at the last position is 5
Element at the given position is 10
23 12 56 10 5

Warteschlange

In der Queue-Datenstruktur werden Elemente von hinten eingefügt und von vorne gelöscht. Daher folgt es dem FIFO-Ansatz ("first in, first out").

Syntax:

 #include <queue>
queue<data_type> variable_name;

Hier sind einige wichtige Warteschlangenmethoden:

  1. push(value ): Diese Methode fügt Elemente zur Warteschlange hinzu.
  2. pop() : Diese Methode löscht das erste Element der Warteschlange.
  3. size() : Diese Methode gibt die Größe der Warteschlange zurück.
  4. front() : Diese Methode gibt das erste Element der Warteschlange zurück.
  5. back() : Diese Methode gibt das letzte Element der Warteschlange zurück.
 queue < int > q;
q.push(30);
q.push(40);
q.push(50);
q.push(60);
q.push(70);
cout << "The first element is " << q.front() << endl;
cout << "The last element is " << q.back() << endl;
cout << "The size of queue is " << q.size() << endl;
q.pop();
cout << "Printing all the elements of the Queue" << endl;
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
}

Ausgabe:

 The first element is 30
The last element is 70
The size of the queue is 5
Printing all the elements of the Queue
40 50 60 70

Stapel

Stapelbehälter arbeiten nach der LIFO-Methode. LIFO steht für „last in, first out“. Daten werden vom selben Ende gepusht und gepoppt.

Syntax:

 #include <stack>
stack<data_type> variable_name;

Hier sind einige wichtige Stapelmethoden:

  1. push(value ): Diese Methode schiebt das Element in den Stack.
  2. pop() : Diese Methode löscht das oberste Element des Stapels.
  3. top() : Diese Methode gibt den Wert des letzten im Stack eingetragenen Elements zurück.
  4. size() : Diese Methode gibt die Größe des Stapels zurück.
  5. empty() : Diese Methode prüft, ob der Stack leer ist oder nicht.
 stack < int > s;
s.push(30);
s.push(40);
s.push(50);
s.push(60);
cout << "The top of the stack contains " << s.top() << endl;
s.pop();
cout << "The top of the stack after performing pop operation: " << s.top() << endl;
cout << "Printing all elements of the stack" << endl;
while (!s.empty()) {
cout << s.top() << " ";
s.pop();
}

Ausgabe:

 The top of the stack contains 60
The top of the stack after performing pop operation: 50
Printing all elements of the stack
50 40 30

einstellen

Set-Container werden verwendet, um eindeutige Werte aufzunehmen, und der Wert des Elements kann nicht mehr geändert werden, nachdem es in das Set eingefügt wurde. Alle Elemente des Sets werden sortiert gespeichert. Der Set-Container ähnelt der Set-Datenstruktur in Python .

Syntax:

 #include <set>
set<data_type> variable_name;

Hier sind einige wichtige Set-Methoden:

  1. insert(value) : Diese Methode fügt Elemente in die Menge ein.
  2. begin() : Diese Methode gibt den Iterator zum ersten Element der Menge zurück.
  3. end() : Diese Methode gibt den Iterator zum letzten Element der Menge zurück.
  4. size() : Diese Methode gibt die Größe des Sets zurück.
  5. empty() : Diese Methode prüft, ob die Menge leer ist oder nicht.
  6. find(value) : Diese Methode gibt den Iterator an das im Parameter übergebene Element zurück. Wenn das Element nicht gefunden wird, gibt diese Funktion den Iterator an das Ende der Menge zurück.
  7. delete(value) : Diese Methode hat das angegebene Element aus der Menge gelöscht.
 set < int > s;
s.insert(20);
s.insert(30);
s.insert(40);
s.insert(50);
s.insert(60);
s.insert(60);
s.insert(60);
auto i = s.begin();
cout << "Element at the first position " << * i << endl;
cout << "The size of the set " << s.size() << endl;
s.find(20) != s.end() ? cout << "Element found" << endl : cout << "Element not found" << endl;
s.erase(30);
cout << "Printing all the elements" << endl;
for (auto i = s.begin(); i != s.end(); i++) {
cout << * i << " ";
}

Ausgabe:

 Element at the first position 20
The size of the set 5
Element found
Printing all the elements
20 40 50 60

C++ muss nicht schwer sein

Wie bei jeder anderen Fertigkeit ist Übung unerlässlich, um das Beste aus der STL herauszuholen. Diese Container und Algorithmen können Ihnen helfen, viel Zeit zu sparen und sind einfach zu verwenden. Beginnen Sie damit, die oben gezeigten Beispiele zu üben, und Sie werden es schließlich auch in Ihren eigenen Projekten verwenden.

Wenn Sie jedoch zum ersten Mal C++ lernen, lernen Sie zunächst die Grundlagen, bevor Sie die STL verstehen.