[英]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;
}
由于在此示例中begin
和end
没有放置在命名空间std
,因此不会编译基于范围的循环。
我之所以没有这样做,是因为在标准名称空间std
为标准容器专用标准功能的合法性(有效性)是我不想讨论的问题。 我认为这是不允许的,尽管专门针对自己的类型是可以的。 但是我不确定。
std::stack
只是一个容器适配器。 它接受一种容器类型(默认为std::deque
)作为模板参数,并且可以从该容器的一个实例构造一个stack
的实例,但是否则底层私有容器不会公开,并且堆栈本身没有迭代设备。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.