文章目录
- C++std::stack容器适配器无法使用范围 for 循环来遍历栈
- 为什么vector和deque之类能用范围 for 循环遍历,stack却不行?
- 如何遍历栈元素?
C++std::stack容器适配器无法使用范围 for 循环来遍历栈
如下伪代码:
stack<int> s;
s.push(10);
s.push(20);
s.push(30);
cout << "栈的大小为:" << s.size() << endl;
for (auto it = s.begin(); it != s.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
无论是用第一种方法遍历栈,还是第二种方法遍历栈,都会报错:
error: ‘class std::stack<int>’ has no member named ‘begin’
![在这里插入图片描述](https://img-blog.csdnimg.cn/94d6a0bfc7cd4f48a7d3d946bdd8c232.png)
这是因为 std::stack 并没有提供 begin() 和 end() 成员函数,所以无法使用范围 for 循环来遍历栈。
为什么vector和deque之类能用范围 for 循环遍历,stack却不行?
std::vector
和 std::deque
都是标准库中的容器,它们都提供了 begin()
和 end()
成员函数,可以使用迭代器来遍历容器中的元素。而 std::stack
并不是一个容器,它是一个容器适配器,它的底层实现可以是 std::vector
或 std::deque
,但是它本身并没有提供 begin()
和 end()
成员函数,因此无法使用迭代器来遍历栈中的元素。
std::stack
的设计初衷是为了提供一种简单的方式来使用底层容器(例如 std::vector
或 std::deque
)实现栈的功能。由于栈的特殊性,它只需要支持一些基本的操作,例如 push()
、pop()
、top()
等,因此 std::stack
并没有提供像 begin()
和 end()
这样的成员函数。
另外,std::stack
的设计也符合了 C++ 标准库的设计理念,即“尽可能地提供最小的接口”。这种设计理念的好处是可以减少库的复杂度,提高库的可维护性和可扩展性。如果 std::stack
提供了 begin()
和 end()
成员函数,那么它就需要实现迭代器等相关的功能,这会增加库的复杂度,降低库的可维护性和可扩展性。
因此,C++ 标准库的设计者们认为,std::stack
不需要提供 begin()
和 end()
成员函数,而是应该提供一些更加基本的操作,例如 push()
、pop()
、top()
等,以便用户更加方便地使用栈的功能。
如何遍历栈元素?
想要遍历栈元素,则不用pop()基本是不行了。
#include <iostream>
#include <stack>
int main() {
std::stack<int> myStack;
myStack.push(1);
myStack.push(2);
myStack.push(3);
while (!myStack.empty()) {
std::cout << myStack.top() << " ";
myStack.pop();
}
std::cout << std::endl;
return 0;
}
但是如有需要,可以将栈元素pop然后保存起来(如果是保存到vector后再遍历,则需用反向迭代器):
#include <iostream>
#include <stack>
#include <vector>
int main() {
std::stack<int> myStack;
myStack.push(1);
myStack.push(2);
myStack.push(3);
std::vector<int> vec;
while (!myStack.empty()) {
vec.push_back(myStack.top());
myStack.pop();
}
for (auto it = vec.rbegin(); it != vec.rend(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)