Устанавливает ли std::stack
в STL C++ любые итераторы базового контейнера или я должен использовать этот контейнер напрямую?
Выводит ли std:: stack итераторы?
Ответ 1
У стека нет итераторов, по определению стека. Если вам нужен стек с итераторами, вам нужно реализовать его самостоятельно поверх другого контейнера (std:: list, std::vector и т.д.). Стек doc здесь.
P.S. Согласно комментарию, полученному от Iraimbilanja, std:: stack по умолчанию использует std:: deque для реализации.
Ответ 2
Если вам нужен стек с итераторами, у вас есть два варианта. std::vector с помощью push_back(), pop_back(). std:: deque с помощью push_back()/pop_back() или push_front()/pop_front().
Ответ 3
std::stack
выставляет свой базовый контейнер (и, следовательно, итераторы) подклассам через свой защищенный интерфейс. Основной объект контейнера std::stack
соответствует (защищенному) элементу данных c
. Поэтому, если вы хотите получить к ним доступ, вы можете немного расширить std::stack
.
template<typename T, typename Container = std::deque<T>>
class iterable_stack
: public std::stack<T, Container>
{
using std::stack<T, Container>::c;
public:
// expose just the iterators of the underlying container
auto begin() { return std::begin(c); }
auto end() { return std::end(c); }
auto begin() const { return std::begin(c); }
auto end() const { return std::end(c); }
};
int main()
{
iterable_stack<int> st;
st.push(2);
st.push(5);
st.push(3);
st.push(7);
st.push(9);
for(auto i: st)
std::cout << i << ' ';
std::cout << '\n';
}
Вывод:
2 5 3 7 9
Ответ 4
Ответ 5
Вы спрашиваете
Предоставляет ли std :: stack итераторы?
Многие люди давали ответы. Если бы мой английский был лучше, я мог бы также понять точное значение "разоблачить".
Если мы ссылаемся на STL и класс std :: stack и предопределенные функции, определенные здесь, ответ НЕТ.
Я думаю, что вы спрашиваете, потому что вы хотите иметь итераторы.
Итак, если мы пойдем еще дальше, у нас есть функция top(). И top() можно интерпретировать как разыменованный итератор. Благодаря этому мы можем легко определить итераторы для элементов стека. Память стека гарантированно будет смежной.
Увидеть ниже. Мы определяем и используем итераторы для std :: copy:
#include <vector>
#include <stack>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <sstream>
using Number = int;
using UnderlyingContainer = std::vector<Number>;
using Stack = std::stack< Number, UnderlyingContainer>;
using StackIterator = const Number *;
std::istringstream testData("5 8 1 4 9 3");
int main()
{
// Put the test data onto the stack
Stack stack{ UnderlyingContainer {std::istream_iterator<Number>(testData),std::istream_iterator<Number>()} };
// Print the test data
// Get iterators
StackIterator end = &stack.top() + 1;
StackIterator begin = end - stack.size();
if (not stack.empty())
std::copy(begin, end, std::ostream_iterator<Number>(std::cout, "\n"));
return 0;
}
Таким образом, вы можете создавать итераторы для стека. Но, будьте осторожны:
Std :: stack намеренно скрывает свои элементы под капотом. Так что, если вы получите доступ к данным для записи, я бы посчитал это ошибкой проекта. Доступ для чтения через константные указатели/итераторы для меня в порядке. Но, возможно, вам лучше использовать std :: vector. , ,