이 글에서는 C++ STL에서 제공하는 deque::at()과 deque::swap() 함수의 동작 방식, 문법, 그리고 실제 사용 예제를 자세히 살펴보겠습니다.
덱(Deque)이란?
덱(Double Ended Queue)은 양쪽 끝(front와 back)에서 모두 데이터의 삽입과 삭제가 가능한 시퀀스 컨테이너입니다. 일반적인 큐(Queue) 자료구조는 데이터를 뒤(END)에만 삽입하고 앞(FRONT)에서만 삭제할 수 있습니다. 버스 정류장의 줄을 떠올려 보면 쉽게 이해할 수 있습니다. 사람은 줄의 맨 뒤에만 새로 설 수 있고, 맨 앞에 서 있는 사람이 가장 먼저 나가게 됩니다. 반면 덱은 이름 그대로 '양쪽 끝이 열린 큐'로서, 양쪽 끝 어디에서든 데이터를 넣고 뺄 수 있다는 점이 가장 큰 특징입니다.
deque::at() 함수란?
deque::at()은 C++ 표준 템플릿 라이브러리(STL)에 내장된 함수로, <deque> 헤더 파일에 선언되어 있습니다. 이 함수는 덱 컨테이너 내에서 지정한 위치에 있는 요소에 대한 참조(reference)를 반환합니다. 함수에 전달된 위치 값에 해당하는 요소에 직접 접근할 수 있으며, 위치 값은 0부터 시작합니다.
참고로 at() 함수는 범위를 벗어난 위치를 인자로 전달하면 std::out_of_range 예외를 발생시키므로, [] 연산자보다 안전하게 요소에 접근할 수 있습니다.
문법
mydeque.at(int position);
매개변수
접근하고자 하는 요소의 위치(position) 하나를 인자로 받습니다.
반환값
지정한 위치에 있는 덱 컨테이너의 요소에 대한 참조를 반환합니다.
예제
Input: deque<int> mydeque = {10, 20, 30, 40};
mydeque.at(2);출력 결과
2번 위치의 요소는 30입니다.
실전 코드 예제
#include <deque>
#include <iostream>
using namespace std;
int main(){
deque<int> myDeque;
myDeque.push_back(90);
myDeque.push_back(80);
myDeque.push_back(70);
myDeque.push_back(60);
myDeque.push_back(50);
myDeque.push_back(40);
myDeque.push_back(30);
myDeque.push_back(20);
myDeque.push_back(10);
for (int i = 0; i < myDeque.size(); ++i){
if (i % 2 == 0){
cout << myDeque.at(i);
cout << " ";
}
}
return 0;
}출력 결과
위 코드를 실행하면 짝수 번째 인덱스(0, 2, 4, 6, 8)에 있는 요소들만 출력됩니다.
90 70 50 30 10
deque::swap() 함수란?
deque::swap() 역시 C++ STL에 내장된 함수로, <deque> 헤더 파일에 선언되어 있습니다. 이 함수는 두 덱 컨테이너의 내용물을 서로 교환(swap)할 때 사용됩니다. 교환하고 싶은 다른 덱 컨테이너 객체를 인자로 전달하면, 현재 덱과 해당 덱의 데이터가 맞바뀌게 됩니다. swap()은 내부적으로 포인터만 교환하기 때문에 매우 빠르게 동작하며, 시간 복잡도는 상수 시간(O(1))입니다.
문법
mydeque1.swap(type_t& mydeque2);
매개변수
현재 덱과 데이터를 교환할 다른 덱 컨테이너에 대한 참조 하나를 인자로 받습니다.
반환값
반환값이 없습니다(void).
예제
Input: deque<int> even = {2, 4, 6, 8};
deque<int> odd = {1, 3, 5, 7};
even.swap(odd);
Output:
Even deque: 1 3 5 7
Odd deque: 2 4 6 8실전 코드 예제
#include <deque>
#include <iostream>
using namespace std;
int main(){
deque<int> Deque_1 = { 1, 2, 3, 4 };
deque<int> Deque_2 = { 3, 5, 7, 9 };
Deque_1.swap(Deque_2);
cout<<"스왑 후 Deque_1의 요소 : ";
for (auto i = Deque_1.begin(); i< Deque_1.end(); ++i)
cout << *i << " ";
cout <<endl<<"스왑 후 Deque_2의 요소 : ";
for (auto i = Deque_2.begin(); i<Deque_2.end(); ++i)
cout << *i << " ";
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
스왑 후 Deque_1의 요소 : 3 5 7 9 스왑 후 Deque_2의 요소 : 1 2 3 4
마무리
정리하면, deque::at()은 덱 내 특정 위치의 요소에 안전하게 접근할 때 유용하며, deque::swap()은 두 덱의 내용을 효율적으로 맞바꿀 때 활용할 수 있습니다. 두 함수 모두 <deque> 헤더에 포함되어 있으므로 별도의 추가 설정 없이 바로 사용할 수 있습니다.