Предоставляет ли std :: stack итераторы? - PullRequest
34 голосов
/ 08 февраля 2009

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

Ответы [ 5 ]

37 голосов
/ 08 февраля 2009

Стек не имеет итераторов, по определению стека. Если вам нужен стек с итераторами, вам нужно реализовать его самостоятельно поверх другого контейнера (std :: list, std :: vector и т. Д.). Доку стека здесь .

P.S. Согласно комментарию, который я получил от Iraimbilanja, std :: stack по умолчанию использует std :: deque для реализации.

12 голосов
/ 08 февраля 2009

Если вам нужен стек с итераторами, у вас есть два варианта. std :: vector с использованием push_back (), pop_back (). std :: deque с помощью push_back () / pop_back () или push_front () / pop_front ().

2 голосов
/ 27 февраля 2018

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 
1 голос
/ 08 февраля 2009

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

0 голосов
/ 10 июня 2019

Ты спрашиваешь

Предоставляет ли 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. , .

...