C++std::stack容器适配器未提供 begin() 和 end() 成员函数,无法使用范围 for 循环(auto)来遍历栈(has no member named ‘begin’)

2023-05-16

文章目录

    • 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 e : s)
    // {
    //     cout << e << " ";
    // }
    // cout << 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’

在这里插入图片描述

这是因为 std::stack 并没有提供 begin() 和 end() 成员函数,所以无法使用范围 for 循环来遍历栈。

为什么vector和deque之类能用范围 for 循环遍历,stack却不行?

std::vectorstd::deque 都是标准库中的容器,它们都提供了 begin()end() 成员函数,可以使用迭代器来遍历容器中的元素。而 std::stack 并不是一个容器,它是一个容器适配器,它的底层实现可以是 std::vectorstd::deque,但是它本身并没有提供 begin()end() 成员函数,因此无法使用迭代器来遍历栈中的元素。

std::stack 的设计初衷是为了提供一种简单的方式来使用底层容器(例如 std::vectorstd::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(使用前将#替换为@)

C++std::stack容器适配器未提供 begin() 和 end() 成员函数,无法使用范围 for 循环(auto)来遍历栈(has no member named ‘begin’) 的相关文章

随机推荐