#1 About Deque
#2 Deque 사용방법
-2.1 deque 선언 & 초기화
-2.2 deque 값 삽입/삭제 - push_back() pop_back() push_front() pop_front()
-2.3 deque 값 중간 삽입/삭제 - insert() erase()
-2.4 첫 번째 원소 / 마지막 원소 접근 - front() back()
#3 Deque 원소 접근
* 개인적인 공부 내용 기록용으로 작성한 글이기에 잘못된 내용이 있을 수 있으며, 지속적으로 수정해 나갈 예정입니다.
#1 About Deque
Deque 컨테이너는 시퀀스 컨테이너이자, 배열 기반 컨테이너입니다. 그래서 Vector 컨테이너와 특징이 매우 유사합니다.하나의 메모리 블록에 저장되는 Vector와 달리 Deque는 여러개의 메모리 블록에 나뉘어 저장된다는 특징을 갖고 있습니다.벡터의 메모리 구조는 [C++ STL] Vector Container 사용 방법 & 관련 예제 총 정리 포스팅을 참고해 주세요.
그림과 같은 메모리 구조를 갖고 있기에, 벡터와 달리 push_front() , pop_front() 를 이용해 앞쪽에서도 원소를 추가/제거할 수 있습니다. 그리고, 중간에서 원소를 추가/삭제를 하는 경우 (insert, erase) Vector에 비해서 효율이 약간 더 우수합니다.
그 이유는 vector는 앞에서 원소를 추가하는 것이 불가능한 스택구조이기에, 모든 원소를 뒤쪽으로 밀어야만 하는데, Deque는 앞 뒤 모두 원소의 추가/삭제가 가능하기에 뒤쪽이나 앞쪽 모두 밀어낼 수 있기 때문입니다.
뿐만 아니라, 단순히 push_back을 통해서 원소를 추가하는 경우에도 deque가 더 효율적입니다. Vector는 메모리가 가득 찼을 때 이 전의 메모리를 삭제하고 원소를 복사한 후 메모리를 재할당하는 방식을 채택하는데, Deque는 단순히 메모리 블럭을 하나 새로 할당합니다.
#2 Deque 사용방법
#2.1 Deque 선언 & 초기화
Deque를 사용하기 위해서는 우선 <deque>를 include 해줘야 합니다.
#inlcude <deque>
다음은 Deque의 기본적인 선언 및 생성자를 이용한 초기화 방식입니다.
deque<자료형 타입> 이름; 형태로 선언합니다.
#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;
int main()
{
deque<int> d1; // int type empty deque 생성
deque<int> d2(5); // 0으로 초기화된 size가 5인 deque
deque<int> d3(5,10); // 10으로 초기화된 size가 5인 deque
deque<int> d4 = {1,2,3,4,5}; // 1,2,3,4,5 의 원소를 가진 deque
deque<int> d5(d4); // d4의 복사본 deque
return 0;
}
#2.2 Deque 값 추가/삭제
■ push_back & pop_back - 뒤에서 원소를 추가/삭제합니다.
* 참고 size() 멤버함수를 통해 deque의 size를 받아올 수 있습니다.
#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;
int main()
{
deque<int> d; // int type empty deque 생성
d.push_back(10); // 10 추가
d.push_back(20); // 20 추가
d.push_back(30); // 30 추가
d.push_back(40); // 40 추가
d.pop_back(); // 맨 뒤의 원소 (40) 삭제
for (int i = 0 ; i < d.size(); i++)
{
cout << d[i] << " ";
}
return 0;
}
[출력결과]
10 20 30
■ push_front & pop_front - 앞에서 원소를 추가/삭제합니다.
#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;
int main()
{
deque<int> d; // int type empty deque 생성
d.push_front(10); // 10 추가
d.push_front(20); // 20 추가
d.push_front(30); // 30 추가
d.push_front(40); // 40 추가
d.pop_front(); // 맨 앞의 원소 (40) 삭제
for (int i = 0 ; i < d.size(); i++)
{
cout << d[i] << " ";
}
return 0;
}
[출력결과] 30 20 10
#2.3 Deque 중간 값 추가/삭제
■ insert(위치,값) - 중간에 값을 추가합니다.
* insert 멤버함수는 begin() 반복자와 함께 사용 가능합니다.
#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;
int main()
{
deque<int> d; // int type empty deque 생성
d.push_back(10); // 10 추가
d.push_back(20); // 20 추가
d.push_back(30); // 30 추가
d.push_back(40); // 40 추가
// begin() + 2 위치에 100 추가
d.insert(d.begin()+2, 100);
for (int i = 0 ; i < d.size(); i++)
{
cout << d[i] << " ";
}
return 0;
}
[출력 결과] 10 20 100 30 40
■ erase(위치,값) - 중간에 값을 삭제합니다.
* erase 멤버함수는 begin() 반복자와 함께 사용 가능합니다.
#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;
int main()
{
deque<int> d; // int type empty deque 생성
d.push_back(10); // 10 추가
d.push_back(20); // 20 추가
d.push_back(30); // 30 추가
d.push_back(40); // 40 추가
// begin() + 2 위치값(30) 삭제
d.erase(d.begin()+2);
for (int i = 0 ; i < d.size(); i++)
{
cout << d[i] << " ";
}
return 0;
}
[출력 결과] 10 20 40
#2.4 첫 번째 원소 / 마지막 원소 접근
front() , back() 멤버함수를 이용해 deque의 첫 번째 값과 마지막 값을 접근 가능합니다.
#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;
int main()
{
deque<int> d; // int type empty deque 생성
d.push_back(10); // 10 추가
d.push_back(20); // 20 추가
d.push_back(30); // 30 추가
d.push_back(40); // 40 추가
// front() 멤버함수를 이용해 맨 앞의 값(10) 접근
cout << "front() ";
cout << d.front() << endl;
// back() 멤버함수를 이용해 마지막 값(40) 접근
cout << "back() ";
cout << d.back() << endl;
return 0;
}
#3 Deque 원소 접근
Deque는 []연산자와 at()멤버함수를 통해 원소에 접근합니다. []과 at()의 차이는 벡터 포스팅의 4>원소접근에 정리해 두었으니 간단한 사용 예제만 작성하고 마치도록 하겠습니다.
#include <deque> // deque 컨테이너를 사용하기 위해 선언
#include <iostream>
using namespace std;
int main()
{
deque<int> d; // int type empty deque 생성
d.push_back(10); // 10 추가
d.push_back(20); // 20 추가
d.push_back(30); // 30 추가
d.push_back(40); // 40 추가
cout << "2번째 원소(30) 출력([]): " << d[2] << endl;
cout << "3번째 원소(40) 출력(at): " << d.at(3) << endl;
return 0;
}
[출력결과]
2번째 원소(30) 출력([]): 30
3번째 원소(40) 출력(at): 40
'Archive > C&C++' 카테고리의 다른 글
[C++] 입력 함수 정리 - cin / getline() (feat. cin.ignore()) (0) | 2021.07.09 |
---|---|
[C++STL] max_element , min_element - 배열/벡터에서 최대,최소 찾기 (0) | 2021.07.06 |
[C++ STL] sort 정렬 함수 사용 방법 정리 (오름차순 & 내림차순) (0) | 2021.05.09 |
[C++ STL] Queue Container 사용법 정리 (0) | 2021.05.06 |
[C/C++] Queue(큐) 자료구조 정리 (1) | 2021.05.06 |