Verschieben von Elementen in einem Array in C++

Jinku Hu 12 Oktober 2023
  1. Verwenden des std::rotate-Algorithmus zum Verschieben von Elementen in einem Array in C++
  2. Verwendung der benutzerdefinierten Wrapper-Funktion für std::rotate zum Verschieben von Elementen in einem Array in C++
  3. Verwenden des std::rotate_copy-Algorithmus zum Verschieben von Elementen in einem Array in C++
Verschieben von Elementen in einem Array in C++

In diesem Artikel werden verschiedene Methoden vorgestellt, wie man Elemente im Array in C++ verschieben kann.

Verwenden des std::rotate-Algorithmus zum Verschieben von Elementen in einem Array in C++

Die Funktion std::rotate ist Teil der C++-Algorithmenbibliothek, die mit dem Header <algorithm> importiert werden kann. Dieser Algorithmus rotiert die Array-Elemente auf die linke Seite. Er nimmt drei Parameter vom Typ Iterator entgegen, von denen der zweite das Element angibt, das das erste Element des neu konstruierten Bereichs sein soll. Währenddessen sind das erste und das dritte Element die Quellbereichsspezifizierer für die Anfangs- und Endpositionen.

Beachten Sie, dass std::rotate verwendet werden kann, um Elemente mithilfe der Iteratoren rbegin/rend auf die rechte Seite zu verschieben. Im folgenden Beispiel wird die Funktion auf dem std::vector-Objekt mit 10 Ganzzahlen aufgerufen und die Operationen für beide Richtungen werden demonstriert.

#include <algorithm>
#include <array>
#include <iostream>
#include <vector>

using std::array;
using std::cout;
using std::endl;
using std::rotate;
using std::vector;

template <typename T>
void printElements(T &v) {
  cout << "[ ";
  for (const auto &item : v) {
    cout << item << ", ";
  }
  cout << "\b\b ]" << endl;
}

int main() {
  vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  printElements(vec);
  rotate(vec.begin(), vec.begin() + 3, vec.end());

  printElements(vec);
  rotate(vec.rbegin(), vec.rbegin() + 3, vec.rend());

  exit(EXIT_SUCCESS);
}

Ausgabe:

[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8, 9, 10, 1, 2, 3 ]

Verwendung der benutzerdefinierten Wrapper-Funktion für std::rotate zum Verschieben von Elementen in einem Array in C++

Alternativ können wir die Wrapper-Funktion implementieren, um den std::rotate-Algorithmus zu kapseln und vom Benutzer nur 2 Argumente zu verlangen - das Array-Objekt, das gedreht werden soll, und die Ganzzahl, die die Anzahl der zu verschiebenden Positionen darstellt. Wir können auch das Vorzeichen der übergebenen Ganzzahl als die Richtung bezeichnen, in die die Rotationsoperation ausgeführt werden soll.

In dieser benutzerdefinierten Funktion haben wir willkürlich die positive Ganzzahl gewählt, um die Rechtsdrehung zu bezeichnen, und die negative, um die Linksdrehung zu bezeichnen.

Beachten Sie, dass diese Funktionsvorlage rotateArrayElements sowohl mit festen als auch mit dynamischen Array-Objekten arbeiten kann, die mit den Containern der C++-Standardbibliothek konstruiert wurden.

#include <algorithm>
#include <array>
#include <iostream>
#include <vector>

using std::array;
using std::cout;
using std::endl;
using std::rotate;
using std::vector;

template <typename T>
void printElements(T &v) {
  cout << "[ ";
  for (const auto &item : v) {
    cout << item << ", ";
  }
  cout << "\b\b ]" << endl;
}

template <typename T>
int rotateArrayElements(T &v, int dir) {
  if (dir > 0) {
    rotate(v.rbegin(), v.rbegin() + dir, v.rend());
    return 0;
  } else if (dir < 0) {
    rotate(v.begin(), v.begin() + abs(dir), v.end());
    return 0;
  } else {
    return 1;
  }
}

int main() {
  array<int, 10> arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
  vector<int> vec = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  rotateArrayElements(arr, 3);
  printElements(arr);

  rotateArrayElements(vec, -3);
  printElements(vec);

  exit(EXIT_SUCCESS);
}

Ausgabe:

[ 8, 9, 10, 1, 2, 3, 4, 5, 6, 7 ]
[ 4, 5, 6, 7, 8, 9, 10, 1, 2, 3 ]

Verwenden des std::rotate_copy-Algorithmus zum Verschieben von Elementen in einem Array in C++

Der Algorithmus std::rotate_copy implementiert die gleiche Operation wie std::rotate, mit dem Unterschied, dass ersterer die gedrehten Array-Elemente in einen anderen Bereich kopiert, der mit einem zusätzlichen Funktionsparameter angegeben wird.

Zuerst müssen wir den neuen Bereich deklarieren, in diesem Fall wird der Typ std::vector gewählt, und der Konstruktor nimmt die Größe des Quellvektors an.

Dann können wir die Funktion rotate_copy mit denselben Parametern aufrufen, die wir für std::rotate angeben würden, und den vierten Iterator, der den Anfang des Zielvektors bezeichnet.

Beachten Sie, dass das folgende Beispiel nur die Linksdrehung der Array-Elemente demonstriert.

#include <algorithm>
#include <array>
#include <iostream>
#include <vector>

using std::array;
using std::cout;
using std::endl;
using std::rotate;
using std::rotate_copy;
using std::vector;

template <typename T>
void printElements(T &v) {
  cout << "[ ";
  for (const auto &item : v) {
    cout << item << ", ";
  }
  cout << "\b\b ]" << endl;
}

int main() {
  vector<int> vec1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

  printElements(vec1);
  vector<int> vec2(vec1.size());
  rotate_copy(vec1.begin(), vec1.begin() + 3, vec1.end(), vec2.begin());
  printElements(vec2);

  exit(EXIT_SUCCESS);
}
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
[ 4, 5, 6, 7, 8, 9, 10, 1, 2, 3 ]
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++ Array