Spostare gli elementi in array in C++

Jinku Hu 12 ottobre 2023
  1. Usa l’algoritmo std::rotate per spostare gli elementi in array in C++
  2. Usa la funzione wrapper personalizzata per std::rotate per spostare gli elementi in array in C++
  3. Usa l’algoritmo std::rotate_copy per spostare gli elementi in array in C++
Spostare gli elementi in array in C++

Questo articolo introdurrà diversi metodi su come spostare gli elementi nella matrice in C++.

Usa l’algoritmo std::rotate per spostare gli elementi in array in C++

La funzione std::rotate fa parte della libreria di algoritmi C++ che può essere importata usando l’intestazione <algorithm>. Questo algoritmo ruota gli elementi dell’array sul lato sinistro. Richiede tre parametri dei tipi di iteratore, il secondo dei quali specifica l’elemento che deve essere il primo elemento dell’intervallo appena costruito. Nel frattempo, il primo e il terzo elemento sono gli specificatori dell’intervallo di origine per le posizioni di inizio e fine.

Notare che std::rotate può essere utilizzato per spostare gli elementi sul lato destro usando gli iteratori rbegin / rend. Nell’esempio seguente, la funzione viene chiamata sull’oggetto std::vector con 10 numeri interi e vengono dimostrate le operazioni per entrambe le direzioni.

#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);
}

Produzione:

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

Usa la funzione wrapper personalizzata per std::rotate per spostare gli elementi in array in C++

In alternativa, possiamo implementare la funzione wrapper per incapsulare l’algoritmo std::rotate e richiedere all’utente di passare solo 2 argomenti: l’oggetto array da ruotare e il numero intero che rappresenta il numero di posizioni da spostare. Possiamo anche indicare il segno dell’intero passato come direzione verso la quale deve essere elaborata l’operazione di rotazione.

In questa funzione personalizzata, abbiamo scelto arbitrariamente il numero intero positivo per indicare la rotazione a destra e il negativo per indicare la rotazione a sinistra.

Si noti che questo modello di funzione rotateArrayElements può funzionare su oggetti array sia fissi che dinamici costruiti con i contenitori della libreria standard C++.

#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);
}

Produzione:

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

Usa l’algoritmo std::rotate_copy per spostare gli elementi in array in C++

L’algoritmo std::rotate_copy implementa la stessa operazione di std::rotate tranne per il fatto che il primo copia gli elementi dell’array ruotati in un altro intervallo specificato con un parametro funzione aggiuntivo.

All’inizio, dobbiamo dichiarare il nuovo intervallo, in questo caso viene scelto il tipo std::vector e il costruttore prende la dimensione del vettore sorgente.

Possiamo quindi chiamare la funzione rotate_copy con gli stessi parametri che specificheremmo per std::rotate e il quarto iteratore che denota l’inizio del vettore di destinazione.

Si noti che il seguente esempio dimostra solo la rotazione a sinistra degli elementi di un array.

#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 ]
Autore: 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

Articolo correlato - C++ Array