Стек объединить как pop (), так и top ()? - PullRequest
0 голосов
/ 05 августа 2020

С std::stack мы используем pop() для извлечения последнего члена и top() для получения его значения. Есть ли ярлык для одновременного выполнения обоих действий (получить значение последнего члена и удалить его)?

Ответы [ 4 ]

2 голосов
/ 05 августа 2020

Есть ли какой-либо ярлык для одновременного выполнения обоих действий?

Нет.

Но вы можете написать функцию, которая вызывает оба действия, и использовать ее как «ярлык».

2 голосов
/ 05 августа 2020

Нет никаких технических причин, по которым это невозможно. Его достаточно просто реализовать в виде утилиты:

template <typename T>
auto pop_value(T & stack) {
    auto v = std::move(stack.top());
    stack.pop();
    return v;
}

Если вы используете C ++ 11, где определение типа возвращаемого значения недоступно, замените auto на typename T::value_type.

1 голос
/ 06 августа 2020

Причина, по которой pop() не возвращает значение всплывающего элемента, заключается в том, что это не безопасно в отношении исключений. Если конструктор копирования для возвращаемого значения вызывает исключение, значение было потеряно. Он был удален из стека, но не был скопирован. Нет возможности вернуть его. Если вас это не волнует, вы можете написать свою «сокращенную» функцию очевидным способом: скопировать объект top(), pop() стек и вернуть значение.

1 голос
/ 05 августа 2020

top () - только возвращает элемент, но не удаляет его. pop () - только удаляет элемент, но ничего не возвращает.

Нет такого метода, который бы удалял и возвращал удаленный элемент.

Обязательно выполняйте пустую проверку при выполнении top или pop, поскольку это вызывает ошибку. Пожалуйста, получите пустой чек перед выполнением любого из этих действий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...