【问题标题】:Using stack defined in C++ stl使用 C++ stl 中定义的堆栈
【发布时间】:2011-02-06 16:33:36
【问题描述】:
#include <stack>
using namespace std;

int main() {
    stack<int> s;
    int i;
    for (i = 0; i <= 10; i++) {
        s.push(i);
    }
    for (i = 0; i <= 10; i++) {
        printf("%d", s.pop());
    }
}

上面的代码有什么问题?

错误:

在函数int main() 中:在需要整数的地方使用聚合值

【问题讨论】:

    标签: c++ stl stack


    【解决方案1】:

    stack::pop 是一个 void 函数,它只是丢弃堆栈上的顶部元素,以获取您要使用的值 stack::top

    这是因为exception safety reasons(如果返回的对象在其复制构造函数中抛出异常会发生什么?)。

    【讨论】:

    • 哦,从来没有意识到这是原因。我一直只是认为这是一种设计的清洁度/关注点的分离之类的东西。 +1启发我。 :)
    • 另外,pop 必须创建一个副本才能返回它。如果用户不希望这样做,那么最终可能会牺牲性能。
    • 根据 Stroustrup (TC++PL) 的说法,真正的原因是性能:如果pop 返回了该值,它将不得不创建一个不必要的副本(因为该值在堆栈中被连续销毁)。不过,两者听起来都是合理的(并且都因移动语义而过时)。
    • @Konrad,因为移动构造器是allowed to throw 我不认为你可以有一个异常安全的pop 来返回值。更别提线程安全的问题了。
    • 但是 (N)RVO 呢? pop 不会在“弹出”它之前直接构造最高值,所以万一发生异常 - 什么都不会丢失。所以无论如何都不会调用移动构造函数。
    【解决方案2】:

    您正在处理 pop() ,这是一个打印到标准输出的操作。流行音乐() 只是从堆栈中删除最顶部的元素。然而最令人困惑的事情 是您的调试输出。

    我使用标准 GNU C++ 编译器编译了您的代码片段 这给了我:

    main.cpp|12|错误:无效表达式的使用

    int main() {
        stack<int> s;
        int i;
        for (i = 0; i <= 10; i++) {
            s.push(i);
        }
        for (i = 0; i <= 10; i++) {
              printf("%i", s.top());
              s.pop();
        }
    }
    

    【讨论】:

      【解决方案3】:

      轻微的挑剔,您的 for 循环实际上是对 11 个项目进行编码,而不是像您通过简要查看循环计数所想到的那样对 10 个项目进行编码。如果您的意思是要添加 11 个元素,请考虑使用

      【讨论】:

        猜你喜欢
        • 2021-12-20
        • 2012-09-28
        • 2016-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-21
        • 1970-01-01
        相关资源
        最近更新 更多