언어/Basic C++

[Basic C++] #66_rotate, 배열 회전

Hardii2 2023. 4. 3. 17:02

 

[Basic C++] #66_rotate, 배열 회전

 

C++에서 제공하는 rotate() 함수에 대해 알아보겠습니다.

 


 

Overview

 

  1. 개념
  2. 코드 예제

 

#0. 개념

1. 배열 회전

  • C++에서 제공하는 rotate() 함수는 지정된 범위 내에서 항목들의 순서를 변경합니다.

 

2. 헤더

#include <algorithm>

 

3. Syntax

template <class ForwardIterator>
void rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last);

 

Details

 

  • rotate() 함수는 총 세 가지 인자를 전달받습니다. first, middle, last.
  • first는 범위의 첫 번째 항목을 가리키는 반복자입니다.
  • middle은 범위의 첫 번째 그룹의 마지막 요소를 가리키는 반복자입니다.
  • last는 범위의 마지막 요소를 가리키는 반복자입니다.
  • rotate() 함수는 범위 [first, last)를 [middle, last)와 [first, middle)로 분할합니다. 그리고 이 두 그룹의 순서를 뒤바꿉니다.

 

#1. 코드 예제

1. 예제-1

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

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

	rotate(begin(v), begin(v) + 4, end(v));

	for (auto val : v)
	{
		cout << val << endl;
	}

	return 0;
}

 

Details

 

  • rotate() 함수를 활용해 vector 컨테이너에 저장된 항목들의 순서를 바꾸는 혹은 회전시키는 코드 예제입니다.
  • first는 begin(v)로 첫 번째 항목을 가리키는 반복자, middle은 begin(v)+4로 4번 인덱스의 항목을 가리키는 반복자, 마지막으로 end(v)는 마지막 항목을 가리키는 반복자입니다.
  • 먼저, [middle, end) 그룹은 { 5, 6, 7, 8, 9 } 이며, middle이 가리키는 항목부터 포함해 end 직전의 항목까지를 두 번째 그룹으로 봅니다.
  • 다음으로, [first, middle) 그룹은  { 1, 2, 3, 4 }이며, first가 가리키는 항목을 포함해 middle 직전의 항목까지를 첫 번째 그룹으로 봅니다.
  • 주의할 점은 첫 번째 그룹과 두 번째 그룹 모두 동일하게 범위의 마지막 항목을 가리키는 반복자 직전의 항목들만 포함된다는 것입니다!

 

2. 예제-2

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

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

	rotate(begin(v), end(v) - 1, end(v));

	for (auto val : v)
	{
		cout << val << endl;
	}

	return 0;
}

 

Details

 

  • rotate() 함수를 통해 vector 컨테이너에 저장된 항목들의 순서를 바꾸는 혹은 회전시키는 또 하나의 예제 코드입니다.
  • 위 예제 코드는 first, middle, last가 비교적 한눈에 들어오지 않습니다.
  • 첫 번째 그룹은 [begin(v), end(v)-1)로 첫 번재 항목부터 마지막 항목 직전의 항목들을 포함합니다.
  • 두 번째 그룹은 [end(v)-1, end(v))로 마지막 항목 부터 마지막 항목까지, 즉 하나의 항목만 포함합니다.
  • 결과적으로, 해당 코드는  vector 컨테이너를 오른쪽으로 한 칸씩 회전시키고 있습니다!