Подтвердить что ты не робот

Выводит ли std:: stack итераторы?

Устанавливает ли std::stack в STL C++ любые итераторы базового контейнера или я должен использовать этот контейнер напрямую?

4b9b3361

Ответ 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

В SGI, MSDN и GNU, stack не предоставляет итератор.

Ответ 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. , ,