C++에서 배열의 요소 이동
-
std::rotate
알고리즘을 사용하여 C++에서 배열의 요소 이동 -
std::rotate
에 대한 사용자 정의 래퍼 함수를 사용하여 C++에서 배열의 요소 이동 -
std::rotate_copy
알고리즘을 사용하여 C++에서 배열의 요소 이동
![C++에서 배열의 요소 이동](/img/Cpp/feature-image---shift-elements-in-array-cpp.webp)
이 기사에서는 C++에서 배열의 요소를 이동하는 방법에 대한 몇 가지 방법을 소개합니다.
std::rotate
알고리즘을 사용하여 C++에서 배열의 요소 이동
std::rotate
함수는<algorithm>
헤더를 사용하여 가져올 수있는 C++ 알고리즘 라이브러리의 일부입니다. 이 알고리즘은 배열 요소를 왼쪽으로 회전합니다. 반복기 유형의 세 가지 매개 변수를 사용하며 두 번째 매개 변수는 새로 생성 된 범위의 첫 번째 요소가되어야하는 요소를 지정합니다. 한편, 첫 번째 및 세 번째 요소는 시작 및 끝 위치에 대한 소스 범위 지정자입니다.
std::rotate
는rbegin
/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 ]
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