std :: stack이 기본적으로 std :: deque를 사용하는 이유는 무엇입니까?


91

스택에서 컨테이너를 사용하는 데 필요한 유일한 작업은 다음과 같습니다.

  • 뒤()
  • push_back ()
  • pop_back ()

기본 컨테이너가 벡터 대신 데크 인 이유는 무엇입니까?

deque 재 할당은 push_front ()가 효율적인 작업이되도록 front () 전에 요소의 버퍼를 제공하지 않습니까? 이러한 요소는 스택 컨텍스트에서 절대 사용되지 않으므로 낭비되지 않습니까?

벡터 대신 이런 방식으로 deque를 사용하는 데 오버 헤드가 없다면 priority_queue의 기본값도 deque가 아닌 벡터 인 이유는 무엇입니까? (priority_queue에는 front (), push_back () 및 pop_back ()이 필요합니다. 기본적으로 스택과 동일합니다.)


아래 답변을 기반으로 업데이트되었습니다.

deque가 일반적으로 구현되는 방식은 고정 크기 배열의 가변 크기 배열 인 것으로 보입니다. 이것은 벡터 (재 할당 및 복사가 필요함)보다 빠르게 성장하므로 요소를 추가하고 제거하는 스택과 같은 경우에는 deque가 더 나은 선택 일 수 있습니다.

priority_queue는 제거 및 삽입 할 때마다 pop_heap () 또는 push_heap ()를 실행해야하므로 인덱싱이 많이 필요합니다. 이것은 요소를 추가하는 것이 어쨌든 일정하게 상각되기 때문에 벡터가 더 나은 선택이 될 것입니다.


1
'업데이트'의 이유가 옳지 않습니다. vector는 일반적으로 deque보다 빠르게 끝에서 요소를 추가하고 제거합니다 . deque는 요소를 밀어 붙이지 않고 메모리늘리는 데 더 빠릅니다 .
Mooing Duck

답변:


75

컨테이너가 커짐에 따라 벡터를 재 할당하려면 모든 요소를 ​​새 메모리 블록에 복사해야합니다. deque를 늘리면 새 블록이 할당되고이를 블록 목록에 연결하므로 복사본이 필요하지 않습니다.

물론 원하는 경우 다른 백업 컨테이너를 사용하도록 지정할 수 있습니다. 따라서 스택이 많이 성장하지 않을 것이라는 것을 알고 있다면, 선호하는 경우 deque 대신 벡터를 사용하도록 지시하십시오.


1
그러나 블록에 대한 포인터 목록이 커지면이 목록은 벡터처럼 재 할당되어야합니다. 점근 적으로 효율성의 모든 이득은 기껏해야 일정한 요소에 의해 결정됩니다. 그리고 반복자 조작 푸시을하고 더 이상 복잡 제대로 팝업 필요 std::deque가에 대한 것보다 std::vector,이 작업은 재 할당보다 훨씬 더 자주 사용될 가능성이있다. 나는 그것이 실제로 std::deque이길 것이라고 믿기 ​​어렵다 std::vector.
Marc van Leeuwen

@Michael 버 : 그럼 사용하지 왜 list, 왜 deque?
bappak

@MarcvanLeeuwen 당신은 당신이 믿기 어렵다고 말합니다 ... 명확한 입장을 제시해 주시겠습니까? 연습에서 std::deque이길 기회가 있다고 지금 믿고 std::vector있다는 뜻인가요, 아니면 여전히 의심한다는 뜻인가요? 감사.
aafulei 2019

내가 개인적으로 쉽게 시간 그 믿음이 있는지 중요한 이유 @fleix 나는 볼 수 없습니다 std::deque뿐만 아니라 할 것입니다 std::vector실제 응용에 있습니다. 그러나 그 가치가 무엇인지, 내 개인적인 경험은 크고 복잡하고 중요한 하나의 작업이 아니라 내 코드를 통해 뿌려진 많은 작은 경우에 스택 및 큐 데이터 구조가 필요하다는 것입니다. 따라서 나는 큰 것보다 작은 사람의 행동에 더 신경을 씁니다. 그리고 deque는 거기에서 특히 둔하게 빛납니다. 내 선호는 둘 다 사용하지 않고 (자체 구현 된) 단일 연결 목록을 대신 사용하는 것입니다. 그러나 마일리지는 다를 수 있습니다.
Marc van Leeuwen 2019

12

벡터와 데크의 상대적인 장점에 대해서는 Herb Sutter 's Guru of the Week 54 를 참조하십시오 .

priority_queue와 queue 사이의 불일치는 단순히 다른 사람들이 구현 한 것이라고 생각합니다.


2
priority_queue는 실제로 push / pop_front를 사용하지 않으며 첫 번째 요소 이외의 요소에 대한 참조는 힙 작업에 의해 무효화됩니다. 따라서 일반 대기열의 경우와 달리 deque의 이점은 적용되지 않습니다.
Potatoswatter 2009

9
또한 priority_queue정렬 된 상태를 유지해야하므로 무작위 액세스의 높은 오버 헤드 deque::iterator가 더 문제가됩니다.
Potatoswatter

1
@Potatoswatter : priority_queue유지되는 "마법의 순서"가 있으며 정렬되지 않습니다. 그러나 귀하의 요점은 유효합니다.
Mooing Duck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.