이 글에서는 C++ STL에서 제공하는 deque::operator=와 deque::operator[]의 동작 원리, 문법, 그리고 실제 사용 예제를 살펴보겠습니다.
덱(Deque)이란?
덱(Double Ended Queue)은 양쪽 끝에서 삽입과 삭제가 모두 가능한 시퀀스 컨테이너입니다. 일반적인 큐(Queue) 자료구조는 데이터를 뒤쪽(rear)에만 삽입하고 앞쪽(front)에서만 삭제할 수 있습니다. 버스 정류장의 줄을 예로 들면, 새로 온 사람은 줄의 맨 뒤에만 추가되고 맨 앞에 선 사람이 가장 먼저 나가게 됩니다. 반면 덱은 이름 그대로 양쪽 끝 어느 쪽에서든 데이터의 삽입과 삭제가 자유롭다는 점이 가장 큰 차이입니다.
deque::operator=란?
deque::operator=는 기존에 저장되어 있던 값들을 대체하면서 새로운 값을 덱 컨테이너에 할당하는 데 사용됩니다. 이 연산자는 할당되는 새로운 값에 맞춰 덱 컨테이너의 크기도 함께 조정합니다.
문법
mydeque1 = mydeque2;
대입 연산자는 같은 타입의 다른 덱 컨테이너를 피연산자로 필요로 합니다.
반환값
이 연산자는 값을 할당받는 덱 컨테이너 자신에 대한 포인터(*this)를 반환합니다.
예제
입력: deque<int> odd = {1, 3, 5, 7};
deque<int> eve = {2, 4, 6};
odd = eve;
출력:
Odd: 2, 4, 6
Eve: 2, 4, 6
예제 코드
#include <deque>
#include <iostream>
using namespace std;
int main(){
deque<int> Deque_1 = { 10, 20, 30 };
deque<int> Deque_2 = { 30, 20, 10 };
deque<int> Deque_3 = {};
// 세 개의 임시 변수를 이용해 두 덱의 요소를 서로 교환(swap)합니다
Deque_3 = Deque_2;
Deque_2 = Deque_1;
Deque_1 = Deque_3;
cout<<"Elements in Deque_1 are: ";
for (auto i = Deque_1.begin(); i!= Deque_1.end(); ++i)
cout << ' ' << *i;
cout<<"\nElements in Deque_2 are: ";
for (auto i = Deque_2.begin(); i!= Deque_2.end(); ++i)
cout << ' ' << *i;
return 0;
}
실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
Elements in Deque_1 are: 30 20 10 Elements in Deque_2 are: 10 20 30
deque::operator[]란?
deque::operator[]는 지정된 위치(인덱스)에 있는 요소에 접근할 때 사용하는 연산자입니다. 이 연산자는 대괄호([]) 안에 주어진 위치에 있는 요소에 대한 참조(reference)를 반환하며, 동작 방식은 deque::at()과 유사합니다.
다만 한 가지 중요한 차이가 있습니다. deque::at()은 컨테이너의 범위를 벗어난 위치에 접근하면 out_of_range 예외를 던지지만, operator[]는 별도의 범위 검사를 수행하지 않기 때문에 잘못된 위치에 접근할 경우 정의되지 않은 동작(undefined behavior)이 발생할 수 있습니다. 따라서 안전한 접근이 필요한 상황이라면 at()을 사용하는 것이 좋습니다. 덱 컨테이너의 인덱스는 0부터 시작한다는 점도 기억해 두세요.
문법
mydeque[position];
접근하고자 하는 요소의 위치(인덱스)가 필요합니다.
반환값
이 연산자는 지정된 위치에 있는 요소에 대한 직접 참조를 반환합니다.
예제
입력: deque<int> mydeque = {1, 2, 3, 4, 5, 6};
mydeque[2];
출력:
3
예제 코드
#include <deque>
#include <iostream>
using namespace std;
int main(){
deque<int> Deque = {10, 20, 30, 40, 50};
cout<<"Elements are : ";
for (int i = 0; i < Deque.size(); ++i){
if (i % 2 != 0){
cout << Deque[i];
cout << " ";
}
}
return 0;
}
실행 결과
위 코드를 실행하면 홀수 번째 인덱스(1, 3)에 해당하는 요소만 출력됩니다.
Elements are : 20 40
마무리
deque::operator=는 한 덱의 내용 전체를 다른 덱으로 복사하거나 교체할 때 유용하며, deque::operator[]는 배열처럼 인덱스를 통해 요소에 빠르게 접근할 수 있게 해줍니다. 다만 operator[]는 범위 검사를 수행하지 않으므로, 안전성이 중요한 코드에서는 deque::at()을 사용하는 습관을 들이는 것이 좋습니다.