Самый эффективный способ вообще не использовать std::stack
и просто использовать std::vector
или даже лучше для этого использовать std::deque
.
Я видел и написал много кода C++ (много), но я пока найти применение для stack
вещи (любого содержательного использования, то есть). Было бы иначе, если базовый контейнер можно было бы изменить или определить тип контейнера во время выполнения, но это не так.
Чтобы скопировать элементы из std::vector
в std::deque
вы можете просто использовать
std::deque<T> stack(vec.begin(), vec.end());
Это позволит реализация использовать наиболее эффективный способ для копирования элементов.
Чтобы явным образом ответить на ваш вопрос: да, единственный способ поместить элементы в стек - это вставить их в цикл. Это неэффективно, но интерфейс стека не определяет ничего другого. Тем не менее, кто написал код, принимающий параметр std::stack
, должен быть запущен (если он/она не обещает, что это никогда не повторится), и его код вернется к чему-то более разумному: вы получите то же (отсутствие) «гибкость», но лучший интерфейс.
Конструкции проблема stack
является то, что она параметризованная на подстилающем контейнерный типе, а вместо этого (чтобы иметь какое-либо значение) должны была быть параметризованный на содержащегося типе элемента и receving в конструкторе контейнера для этого типа (таким образом, скрывая тип контейнера). В его нынешнем виде в основном бесполезно.
Либо пройти вектор по константной-ссылке, так как он не модифицируется, или по значению и переместить содержимое в стек. Последняя версия позволяет компилятору генерировать более эффективный код в тех же случаях. – Jens
'std :: stack <....>' из чего? По умолчанию 'stack' использует в качестве основного контейнера' deque', а не 'vector'. –
См. Мое редактирование. Я добавил больше контекста. – AlexB