繁体   English   中英

Stack在C ++中有迭代器吗?

[英]Does Stack have iterators in C++?

据我所知,栈在C ++中没有迭代器。 例如,此帖子( std :: stack是否公开迭代器? )明确声明stack没有迭代器。 但是,我的主管告诉我,c ++中的堆栈应该具有​​迭代器,因为它是标准数据结构,并且可以执行stack.begin()(但是据我所知,标准C ++中没有这样的语法)。 我该如何说服他? 为什么堆栈在C ++中没有迭代器?

问题2:谢谢大家的出色回答。 我认为现在的问题归结为:为什么为堆栈设置迭代器没有意义?

您可以通过建议您的主管去说服主管,并阅读ISO / IEC-14882(2011)的23.6.5节,即std::stack的规范。

std::stack没有迭代器。

std::stack提供了底层容器的严格后进先出视图,这就是要点:将底层容器的使用限制为LIFO。

因此,它不提供迭代。

但是,它确实将基础容器提供为protected成员,这意味着它是为从其派生而设计的。 在派生类中,您可以提供迭代器以及任何所需的对象。 同样,即使不使用任何强制类型转换(即通过成员数据指针的隐式转换),也可以仅访问普通std::stack protected成员。

重新添加第二个问题,

为什么为堆栈设置迭代器没有意义?

这可能是有道理的,但是在大多数情况下,它将提供std::stack用于删除的非LIFO访问,即,在大多数情况下,这与std::stack目的相矛盾。

对于调试,调试器将显示std::stack的内容,因此不需要直接支持在代码中进行调试。


例:

#include <iostream>
#include <stack>

namespace cppx {
    using std::stack;

    namespace hack {
        template< class Item >
        auto container_of( stack<Item> const& st )
            -> typename stack<Item>::container_type const&
        {
            struct Hacked: stack<Item> { using stack<Item>::c; };
            return st.*&Hacked::c;
        }
    }  // namespace hack

    template< class Item >
    auto begin( stack<Item> const& st )
    { return hack::container_of( st ).begin(); }

    template< class Item >
    auto end( stack<Item> const& st )
    { return hack::container_of( st ).end(); }

}  // namespace cppx    

auto main()
    -> int
{
    using namespace std;

    stack<int> st;
    for( int const x : {3, 1, 4, 1, 5, 9, 2, 6, 5, 4} )
    {
        st.push( x );
    }

    using cppx::begin; using cppx::end;
    for( auto it = begin( st ); it != end( st ); ++it )
    {
        cout << *it << " ";
    }
    cout << endl;
}

由于在此示例中beginend没有放置在命名空间std ,因此不会编译基于范围的循环。

我之所以没有这样做,是因为在标准名称空间std为标准容器专用标准功能的合法性(有效性)是我不想讨论的问题。 我认为这是不允许的,尽管专门针对自己的类型是可以的。 但是我不确定。

std::stack只是一个容器适配器。 它接受一种容器类型(默认为std::deque )作为模板参数,并且可以从该容器的一个实例构造一个stack的实例,但是否则底层私有容器不会公开,并且堆栈本身没有迭代设备。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM