Vektorcontainer in C++ STL

Jinku Hu 12 Oktober 2023
  1. Verwenden von std::vector zum Konstruieren eines dynamischen Arrays in C++
  2. Verwendung von std::vector zum Speichern von struct-Objekten in C++
  3. Verwenden der Funktion std::vector::swap zum Vertauschen von Vektorelementen in C++
Vektorcontainer in C++ STL

In diesem Artikel werden verschiedene Methoden zur Verwendung eines Vektor-Containers in C++ vorgestellt.

Verwenden von std::vector zum Konstruieren eines dynamischen Arrays in C++

std::vector ist Teil der Containerbibliothek und implementiert ein dynamisch anpassbares Array, das Elemente in einem zusammenhängenden Speicher speichert. vector-Elemente werden normalerweise am Ende mit den eingebauten Funktionen push_back oder emplace_back hinzugefügt. Der Vektor-Container kann einfach mit der Initialisierungsliste konstruiert werden, wie im folgenden Beispielcode gezeigt - Objekt arr. Außerdem kann man statische Initialisierungslistenwerte im Makroausdruck speichern und die Initialisierungsoperation bei Bedarf prägnant ausdrücken.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

#define INIT \
  { "Neque", "porro", "quisquam", "est", "qui", "dolorem", "ipsum", "quia" }

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  vector<string> arr = {"Neque", "porro",   "quisquam", "est",
                        "qui",   "dolorem", "ipsum",    "quia"};
  printVector(arr);

  cout << endl;

  vector<string> arr2 = INIT;
  printVector(arr2);

  cout << endl;

  return EXIT_SUCCESS;
}

Verwendung von std::vector zum Speichern von struct-Objekten in C++

std::vector kann verwendet werden, um benutzerdefinierte Strukturen zu speichern und sie mit der geschweiften Listennotation zu initialisieren, die dem vorherigen Beispiel ähnelt. Beachten Sie, dass beim Hinzufügen eines neuen struct-Elements mit der Funktion push_back der Wert als geschweifte Liste übergeben werden sollte. Wenn sich in einer struct mehrere verschachtelte Strukturen befinden, sollte die entsprechende Notation verwendet werden.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::string;
using std::vector;

struct cpu {
  string wine;
  string country;
  int year;
} typedef cpu;

int main() {
  vector<cpu> arr3 = {{"Chardonnay", "France", 2018}, {"Merlot", "USA", 2010}};

  for (const auto &item : arr3) {
    cout << item.wine << " - " << item.country << " - " << item.year << endl;
  }

  arr3.push_back({"Cabernet", "France", 2015});
  for (const auto &item : arr3) {
    cout << item.wine << " - " << item.country << " - " << item.year << endl;
  }

  return EXIT_SUCCESS;
}

Verwenden der Funktion std::vector::swap zum Vertauschen von Vektorelementen in C++

std::vector bietet mehrere integrierte Funktionen, um seine Elemente zu bearbeiten, von denen eine swap ist. Es kann vom Vektor-Objekt aufgerufen werden und einen anderen Vektor als Argument verwenden, um deren Inhalt auszutauschen. Eine weitere nützliche Funktion ist size, mit der die aktuelle Elementanzahl im angegebenen Vektor-Objekt abgerufen wird. Beachten Sie jedoch, dass es eine ähnliche Funktion namens capacity gibt, die die Anzahl der im aktuell zugewiesenen Puffer gespeicherten Elemente zurückgibt. Letzteres wird manchmal größer zugewiesen, um unnötige Aufrufe der Betriebssystemdienste zu vermeiden. Der folgende Beispielcode zeigt das Szenario, in dem die beiden Funktionen unterschiedliche Werte zurückgeben.

#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::vector;

template <typename T>
void printVector(vector<T> &vec) {
  for (const auto &item : vec) {
    cout << item << ", ";
  }
  cout << endl;
}

int main() {
  vector<int> arr4 = {1, 12, 45, 134, 424};
  vector<int> arr5 = {41, 32, 15, 14, 99};

  printVector(arr4);
  arr4.swap(arr5);
  printVector(arr4);

  cout << "arr4 capacity: " << arr4.capacity() << " size: " << arr4.size()
       << endl;

  for (int i = 0; i < 10000; ++i) {
    arr4.push_back(i * 5);
  }

  cout << "arr4 capacity: " << arr4.capacity() << " size: " << arr4.size()
       << endl;
  arr4.shrink_to_fit();
  cout << "arr4 capacity: " << arr4.capacity() << " size: " << arr4.size()
       << endl;

  return EXIT_SUCCESS;
}

Ausgabe:

1, 12, 45, 134, 424,
41, 32, 15, 14, 99,
arr4 capacity: 5 size: 5
arr4 capacity: 10240 size: 10005
arr4 capacity: 10005 size: 10005
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Verwandter Artikel - C++ Vector