【问题标题】:pop_back() not workingpop_back() 不工作
【发布时间】:2023-03-07 17:14:02
【问题描述】:

我有以下主程序,它创建一个Stack 对象,用双精度填充它,然后弹出它们。代码文件很好,但pop_back() 部分似乎不起作用,而s.back() 确实返回了正确的值。这怎么可能?

#include "Stack.h"
#include <iostream>
#include <deque>
using namespace std;
int main() {

  Stack<double> s(0,0.0);

  // Write doubles into Stack
  int i ;
  for (i=0 ; i<15 ; i++) {

    s.push(i*i) ;

  }


  // Read doubles back from fifo
  while (!s.empty()) {
    double val = s.pop() ;
    std::cout << "Popping value " << val << " from stack" << std::endl ;

  }

  return 0 ;

}

我的头文件看起来像这样,其中我省略了与问题无关的部分。

#ifndef STACK_H
#define STACK_H

#include <iostream>
#include <deque>  

template<class T>
class Stack {

public:  

  Stack(int len, T defval): s(len+1, defval) {

    return;
}

~Stack() {

    //delete [] s;
}

void push(T c) {

    s.push_back(c);

}

T pop() {

    return s.back();
    s.pop_back();  

}

private:   

  std::deque<T> s; //Array<T> s;  

};

#endif

【问题讨论】:

  • 你的return之前 pop_back
  • 你的pop()函数在s.pop_back()被调用之前返回。
  • 请做三件事:1. 启用所有编译器警告,2. 将它们设置为错误,3. 也尝试使用优化进行编译。那应该可以检测到问题。不幸的是,您必须包含 3.,因为在某些编译器中,仅在优化期间才会检测到死代码。

标签: c++ stack deque


【解决方案1】:
T pop() {
    return s.back();
//  ^^^^^

    s.pop_back(); // <- unreachable! 
}

当您从一个函数中return 时,所有后续指令将永远不会执行


s.back() 的结果存储在一个临时变量中:

T pop() {
    auto back = s.back();
    s.pop_back();  
    return back;
}

【讨论】:

  • 谢谢,现在可以了。但是,该函数现在返回一个小的随机数,而不是正确的双精度数。
  • 通过将val 替换为s.pop() 来修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
  • 1970-01-01
  • 2019-04-23
  • 2017-08-20
  • 2020-07-08
  • 1970-01-01
  • 2014-06-10
相关资源
最近更新 更多