Чому std :: stack за замовчуванням використовує std :: deque?


91

Оскільки єдиними операціями, необхідними для використання контейнера в стеку, є:

  • назад ()
  • відсунути()
  • pop_back ()

Чому контейнер за замовчуванням для нього є декаком замість вектора?

Чи не перерозподіли за допомогою deque дають буфер елементів перед front (), щоб push_front () був ефективною операцією? Хіба ці елементи не витрачаються даремно, оскільки вони ніколи не будуть використовуватися в контексті стека?

Якщо немає накладних витрат на використання deque таким чином замість вектора, чому за замовчуванням для prior_queue вектор також не deque? (prior_queue вимагає front (), push_back () та pop_back () - по суті такий самий, як для стека)


Оновлено на основі відповідей нижче:

Здається, що спосіб реалізації deque - це масив змінних розмірів із масивами фіксованого розміру. Це робить зростання швидшим, ніж вектор (що вимагає перерозподілу та копіювання), тому для чогось на зразок стека, який полягає у додаванні та видаленні елементів, deque, швидше за все, є кращим вибором.

priority_queue вимагає значної індексації, оскільки кожне видалення та вставка вимагає запуску pop_heap () або push_heap (). Це, мабуть, робить вектор кращим вибором там, оскільки додавання елемента все одно амортизується постійно.


1
Аргументи у вашому "оновленні" не зовсім правильні. vector зазвичай додає і видаляє елементи з кінця швидше, ніж деке. deque швидше росте пам'ять , а не штовхає елементи.
Мукінг-качка

Відповіді:


75

У міру зростання контейнера для перерозподілу вектора потрібно копіювати всі елементи в новий блок пам'яті. Зростаючий деке виділяє новий блок і пов'язує його зі списком блоків - копії не потрібні.

Звичайно, ви можете вказати, що за бажанням використовуватиметься інший контейнер для підкладки. Отже, якщо у вас є стек, який, як ви знаєте, не буде сильно рости, скажіть йому використовувати вектор замість deque, якщо це ваша перевага.


1
Але коли список покажчиків на блоки зростає, його час від часу потрібно перерозподіляти так само, як і вектор; асимптотично, будь-який приріст ефективності в кращому випадку є постійним фактором. І маніпуляції з ітераторами, необхідні для правильного натискання та виштовхування, набагато складніші, std::dequeніж для них std::vector, і ці операції, швидше за все, будуть використовуватися набагато частіше, ніж перерозподіл. Я важко вірю, що std::dequeколи-небудь би перемогло std::vectorна практиці.
Марк ван Левен

@Michael Burr: Тоді чому б не використовувати list, чому deque?
bappak

Щодо вас @MarcvanLeeuwen, ви кажете, що вам важко повірити ... не могли б ви дати чітку позицію? ви маєте на увазі, що зараз вважаєте, що std::dequeмає шанс перемогти std::vectorна практиці, чи ви маєте на увазі, що все ще сумніваєтесь у цьому? Дякую.
aafulei

@fleix Я не розумію, чому так важливо, чи мені особисто легше повірити, що std::dequeвдасться зробити це так само добре, як std::vectorу практичному застосуванні. Але для того, що варто, мій особистий досвід полягає в тому, що мені потрібні структури даних стека та черги не для однієї великої та складної задачі, а для багатьох маленьких випадків, посипаних через мій код. Як такий, я більше дбаю про поведінку в малому, ніж у великому; і деке там світить особливо тьмяно. Я віддаю перевагу використанню ні того, ні іншого, а (самореалізованого) списків, що мають єдиний зв’язок. Але ваш пробіг може відрізнятися.
Марк ван Левен

12

Дивіться Гуру тижня 54 Трави Саттера щодо відносних достоїнств вектора та відтінку, де б це зробили.

Думаю, невідповідність черги_приоритету та черги полягає просто в тому, що їх застосовували різні люди.


2
priority_queue насправді не використовує push / pop_front, а посилання на елементи, крім першого, анулюються операціями купи. Отже, жодна з переваг deque не застосовується, на відміну від звичайної черги.
Potatoswatter

9
Крім того, priority_queueповинен залишатися відсортованим, тому більші накладні витрати на випадковий доступ deque::iteratorє більш проблематичними.
Potatoswatter

1
@Potatoswatter: priority_queueмає "чарівний порядок", який підтримується, він не сортується. Однак ваша точка зору стоїть.
Мукінг-качка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.