[알고리즘 개념] STL 스택, 큐, 덱에 인덱스 접근과 초기 크기 할당이 가능할까?

ᴄsᴇ ᴘᴇʙʙʟᴇ·2022년 3월 20일
0
post-thumbnail

💻 STL 스택, 큐, 덱에 배열 인덱스 접근과 초기 크기 할당이 가능할까?

원칙적으로는 STL stack, queue, deque에 인덱스 접근도 불가능하고, 중간에 위치한 자료에 대한 삽입/삭제 등의 연산도 불가능하다. only 앞이나 뒤에서만 가능하다. 즉 중간에 있는 원소에 대한 확인/변경 모두 불가능하다.

또한 vector처럼 초기 크기 할당이 불가능하다.

예외 스택, 큐를 구현할 때 배열로 구현하면 가능하지만, STL에서는 불가능하다는 것!

중요 하지만 STL deque은 굉장히 특별하다!

  • deque에서는 인덱스로 원소에 접근할 수 있다.
  • deque에서는 초기 크기 할당도 가능하다.

임의의 인덱스 접근/변경과 초기 크기 할당이 가능하다는 점에서 vector와 비슷해보이지만 분명한 차이가 있다.

대표적으로 dequevector와 달리 크기가 할당되지 않아도 처음부터 특정 인덱스에 접근할 수 있다.

그 이유는 vector는 공간을 늘릴 때 배열 자체를 reallocation(재할당)하지만, deque은 일정 크기를 가지는 chunk(덩어리) 단위로 공간을 늘려주기 때문이다.

이에 대한 내용은 공식문서에 더 자세히 나와있다.


💻 예시로 확인해봅시다

✏️ 우선 vector 예시를 먼저 보자

  • vector의 경우 오른쪽 코드의 vector<int> v(5)(5의 크기만큼 0으로 초기화)처럼 크기를 할당해주어야 임의의 원소에 접근할 수 있다.

✏️ 그렇다면 deque은 어떨까?

  • 둘 다 된다! 위에서 말했듯 dequechunk 단위로 공간을 가지고 있기 때문이다.

✏️ deque에 대한 추가 궁금증

그럼 chunk 단위니까 내가 할당한 크기 5 뒤에도 or 크기를 할당하지 않아도 공간이 할당되어 있을 수도 있겠네?

이를 실험하기 위해 이렇게 코드를 짜보자!

  1. deque에 크기 10을 할당해준다.
  2. 앞 5개는 사용자 입력을 받아서 값을 넣어준다.
  3. 총 15개를 출력해본다.

👉 예상되는 결과는

  1. 할당한 크기 10개 중 앞 5개는 사용자 입력값이 나오고,
  2. 나머지 5개는 0이 나올 것이다.
  3. 그리고 크기를 할당하지 않은 부분인 나머지 5개도 0이 나오겠지..?

예상이 맞을지 확인해보자!

  • 역시나 1, 2번 예상대로 사용자 입력 부분(결과 첫 번째 줄)은 제대로 나오고, 크기를 할당한 나머지 부분(결과 두 번째 줄)은 0으로 출력된다.
  • 하지만 3번 예상이 틀렸다! 크기를 할당하지 않은 나머지 부분(결과 세 번째 줄)은 이상한 결과가 출력된다.

👉 chunk 단위로 할당할 때 항상 0으로 할당되지는 않는다는 것을 알 수 있다!!


💻 결론

c++ STL에서는 stack, queue와 달리 deque에서는 임의의 인덱스 접근이 가능하고, 크기 할당 또한 가능하다. 이러한 점에서 vector와 비슷하다.

다만 dequevector와 다른 점은 chunk 단위로 공간을 할당하기 때문에 초기 공간 할당 없이 인덱스 접근이 가능하다는 것이다. 하지만 공간이 할당될 때 그 값이 항상 0으로 초기화되는 것은 아니다.

profile
ꜱɪɴᴄᴇ 2021.09.01

0개의 댓글