2016-04-29 4 views
0

Ich habe Probleme mit dem Stapeln von Werten für ein Deque-Objekt, das in einem Vorlagenklassenstapel definiert ist. Beim Initialisieren eines Klassenstapelobjekts und Verwenden der push_back() -Memberfunktion der STL-Deque-Klasse für das initialisierte Objekt und Lesen der Anzahl von Elementen innerhalb des Stapels werde ich Null, aber das Terminal sagte mir, dass es Werte hinein geschoben hat. Es sieht aus wie folgt:C++: Verwenden von Deque-Elementfunktionen innerhalb eines Klassenstacks

Stapel-Header-Datei

#ifndef STACK_HH 
#define STACK_HH 

#include <iostream> 
#include <deque> 

template<class T> 
class Stack { 

    public: 
     Stack(): s() { // <-- creating an empty deque s 
      s.size() ; 
      nitems() ; 
      empty() ; 
     } 

     ~Stack() {       
      nitems() ; 
      empty() ; 
     } 

     //Member functions 
     int nitems() { return s.size() ; } 
     bool empty() { return (s.size()==0) ; } 

     void push_back(T c) { 
      s[s.size()] = c ; 
     } 

     T back() { 
      return s[s.size()] ; 
     } 

     void pop_back() { 
      if (empty()) { 
       std::cout << "Stack::pop() Error: stack is empty" << std::endl ; 
      }  
     } 

    private: 
     std::deque<T> s ; 

}; 

#endif 

Haupt Skript

#include <iostream> 
#include <deque> 
#include "Stack.h" 

using namespace std ; 

// Main 
int main() { 

    int LEN = 10; 

    Stack<double> s ; 

    // Write doubles into Stack 
    for (int i=0 ; i<LEN ; i++) {   
     cout << "pushing value " << i*i << " in stack s" << endl ; 
     s.push_back(i*i) ; 
    } 

    // Count doubles in fifo 
    cout << s.nitems() << " value(s) in stack" << endl ; 

    return 0 ; 
} 

ich mich gefragt, ob ich die deque push_back() definieren sollte, zurück() und pop_back() funktioniert anders in meiner Stack-Header-Datei. Etwas wie void deque < T> :: push_back() und ähnlich für die anderen. Aber das hat es nicht gelöst, da ich bereits erwartet hatte, dass s.pushback() auch nicht funktionierte.

Jede Hilfe bei der Lösung dieses Problems wird gerne angenommen.

EDIT:

Vielen Dank für die Hilfe.

Antwort

1

Sie können in der Tat direkt die deque Methoden wie die Verwendung:

template<class T> 
class Stack { 

    public: 
     Stack(): s() { // <-- creating an empty deque s 
     } 

     ~Stack() {       
     } 

     //Member functions 
     int nitems() const { return s.size() ; } 
     bool empty() const { return s.empty() ; } 

     void push_back(const T& c) { 
      s.push_back(c) ; 
     } 

     const T& back() { 
      return s.back(); 
     } 

     void pop_back() { 
      if (empty()) { 
       std::cout << "Stack::pop() Error: stack is empty" << std::endl ; 
      } 
      s.pop_back(); 
     } 

    private: 
     std::deque<T> s ; 
}; 
1

Warum nicht std::stack?


Zuordnung zu s[s.size()] fügt keine neue Elemente:

Hinweise

Im Gegensatz zu std :: map :: operator [], dieser Operator fügt nie ein neues Element in den Behälter.

Von http://en.cppreference.com/w/cpp/container/deque/operator_at.

Verwenden Sie , um ein neues Element hinzuzufügen.


letzte Element ist s[s.size() - 1] oder, besser, s.back().


s.size(), s.size() und empty() in und Destruktor nichts tun.

Verwandte Themen