2017-03-31 1 views
0

私はStackオブジェクトを作成し、それを倍精度で埋めてポップします。コードファイルは正常ですが、pop_back()の部分は機能していないようですが、s.back()は正しい値を返します。これはどのように可能ですか?pop_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 ; 

} 

私のヘッダーファイルは、この質問に関係のない部分は省略しています。あなたの関数からreturn、後続のすべての命令がを実行されることはありません

#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 
+2

[STD ::スタック](http://en.cppreference.com/w/cpp/container/と間違って何スタック)? –

+5

あなたの 'return'は' pop_back'です。 –

+1

'pop()'関数は 's.pop_back()'が呼び出される前に返します。 –

答えて

5
T pop() { 
    return s.back(); 
// ^^^^^ 

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

。代わりに、一時変数に格納s.back()の結果


は:

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

ありがとうございました。しかし、この関数は正しいdoubleの代わりに小さな乱数を返します。 –

+0

'val'を' s.pop() 'に置き換えることで修正しました。 –

関連する問題