Чи існує існуюча структура даних, яка має фіксований розмір, і виштовхне найстаріший / останній елемент, якщо вставлений новий елемент?


20

Я шукаю структуру даних, яка виштовхне його найстаріший / останній елемент, якщо вставити новий елемент. Наприклад, нехай Dпредставляє структуру. Dмістить 3 елементи Number Dтипових значень типу буде ініціалізовано до 1, 2та 3.

D=[1,2,3]

Якщо Numberщо містить значення 5вставляється D, 3буде виштовхувати, в той час як 1і 2зрушені вправо.

D=[5,1,2]

Перше, що спадає на думку, був би масив, але визначення не включає поведінку, що підштовхує.


Ну, немає вбудованої структури даних, але це просто реалізувати, використовуючи подвійний список, пов'язаний зі списком, правда?
Користувача не знайдено

1
А як щодо використання обгортки, успадкованого з черги? Потім ви додаєте метод void push_replace(T val) { pop(); push(val); }.
Франческо Донді

@FrancescoDondi, мабуть, має бутиT push_replace(T val) { T old = pop(); push(val); return old; }
valbaca

1
Однозначно є зараз: ви просто неофіційно це визначили; можливо, ви повинні запитати, чи добре він відомий, чи є загально узгоджений інтерфейс і чи доступні реалізації (не те, що остання є великою проблемою).
PJTraill

@valbaca Я думаю про C ++, де pop()нічого не повертається через проблеми з розмотуванням стека у випадку, якщо винятки копіюють складний об'єкт, тому ви повинні використовувати його front()раніше, якщо вам це потрібно, перш ніж відкинути. Але впевнено, якщо ви не переймаєтесь винятками, ваш шлях може бути кращим.
Франческо Донді

Відповіді:


44

Черги з фіксованим розміром часто реалізовуються за допомогою того, що деякі називають круговими буферами . Якщо зняти захист від його заповнення, ви отримаєте бажану поведінку.

Звичайно, жодне фактичне натискання не відбудеться в масиві - це було б занадто дорого - але це виглядатиме як зовні.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
Рафаель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.