C++에서 배열의 요소 이동

Jinku Hu 2023년10월12일
  1. std::rotate 알고리즘을 사용하여 C++에서 배열의 요소 이동
  2. std::rotate에 대한 사용자 정의 래퍼 함수를 사용하여 C++에서 배열의 요소 이동
  3. std::rotate_copy 알고리즘을 사용하여 C++에서 배열의 요소 이동
C++에서 배열의 요소 이동

이 기사에서는 C++에서 배열의 요소를 이동하는 방법에 대한 몇 가지 방법을 소개합니다.

std::rotate 알고리즘을 사용하여 C++에서 배열의 요소 이동

std::rotate 함수는<algorithm>헤더를 사용하여 가져올 수있는 C++ 알고리즘 라이브러리의 일부입니다. 이 알고리즘은 배열 요소를 왼쪽으로 회전합니다. 반복기 유형의 세 가지 매개 변수를 사용하며 두 번째 매개 변수는 새로 생성 된 범위의 첫 번째 요소가되어야하는 요소를 지정합니다. 한편, 첫 번째 및 세 번째 요소는 시작 및 끝 위치에 대한 소스 범위 지정자입니다.

std::rotaterbegin /rend 반복자를 사용하여 요소를 오른쪽으로 이동하는 데 활용할 수 있습니다. 다음 예에서는 10 개의 정수를 사용하여std::vector 객체에서 함수가 호출되고 양방향 작업이 설명됩니다.

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

출력:

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

std::rotate에 대한 사용자 정의 래퍼 함수를 사용하여 C++에서 배열의 요소 이동

또는 std::rotate알고리즘을 캡슐화하는 래퍼 함수를 구현하고 사용자가 2 개의 인수 (회전 할 배열 객체와 이동할 위치 수를 나타내는 정수) 만 전달하도록 요구할 수 있습니다. 전달 된 정수의 부호를 회전 작업이 처리되어야하는 방향으로 표시 할 수도 있습니다.

이 사용자 지정 함수에서는 오른쪽 회전을 의미하는 양의 정수와 왼쪽 회전을 의미하는 음의 정수를 임의로 선택했습니다.

rotateArrayElements 함수 템플릿은 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);
}

출력:

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

std::rotate_copy 알고리즘을 사용하여 C++에서 배열의 요소 이동

std::rotate_copy 알고리즘은 전자가 회전 된 배열 요소를 추가 함수 매개 변수로 지정된 다른 범위로 복사한다는 점을 제외하면std::rotate와 동일한 작업을 구현합니다.

처음에는 새로운 범위를 선언해야합니다.이 경우 std::vector유형이 선택되고 생성자는 소스 벡터의 크기를 사용합니다.

그런 다음 std::rotate및 대상 벡터의 시작을 나타내는 네 번째 반복자에 대해 지정하는 것과 동일한 매개 변수를 사용하여 rotate_copy함수를 호출 할 수 있습니다.

다음 예제는 배열 요소의 왼쪽 회전 만 보여줍니다.

#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 ]
작가: 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

관련 문장 - C++ Array