我必须从文件100中读取不同种类的任务,以便对队列执行不同的操作,并在输出文件上进行打印。 但我“抛出'std :: bad_alloc'实例后被终止调用” 作为错误 我认为模板声明中有一些内容。 我试图用不同的方式声明它,但似乎不起作用。 如果有人可以帮助我,我将非常感激。
#include <iostream>
#include <fstream>
#include <string>
#define INPUT_FILE "input.txt"
#define OUTPUT_FILE "output.txt"
using namespace std;
template <typename T> class Pila
{
private:
bool empty=1;
public:
int lunghezza;
int cima;
T * Tab;
Pila(int L){
lunghezza=L;
Tab= new T[L];
cima=lunghezza;
}
void Push(T L){
cima--;
Tab[cima]=L;
}
void Pop(){
if(!empty)
cima++;
if(cima=lunghezza) empty=1;
}
bool Empty(){
if(empty==1) return 1;
else return 0;
}
T top(){
return Tab[cima];
}
void Print(){
for(int i=lunghezza-1; i>=cima; i--) cout<< Tab[i]<< " ";
}
};
template <typename V> class Queue
{
public:
int lunghezza;
Queue(int l){
lunghezza=l;
};
Pila<V> A= Pila <V>(lunghezza);
Pila<V> B= Pila <V>(lunghezza);
void enqueue(V L){ //sposta tutti gli elementi da A a B
while(!A.Empty()){
B.Push(A.top());
A.Pop();
}
A.Push(L); //Mette L dentro A
while(!B.Empty()){ //sposta tutto di nuovo dentro A
A.Push(B.top());
B.Pop();
}
}
void dequeue(){
if(A.Empty()){
cout<< " Coda Vuota"<< endl;
}
else
A.Pop();
}
void Stampa(){
A.Print();
cout<< endl;
}
};
int main(){
fstream infile, outfile;
infile.open(INPUT_FILE, fstream::in);
outfile.open(OUTPUT_FILE, fstream::out);
int c=0, N,tmp;
string tipo,operazione;
while(c<100){
infile>> tipo;
infile>> N;
if(tipo=="int"){
Queue<int> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
int elem=stoi(operazione.substr(1));
A.enqueue(elem);
}
}
A.Stampa();
}
if(tipo=="double"){
Queue<double> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
double elem=stod(operazione.substr(1));
A.enqueue(elem);
}
}
A.Stampa();
}
if(tipo=="bool"){
Queue<bool> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
bool elem=stoi(operazione.substr(1));
A.enqueue(elem);
}
}
A.Stampa();
}
if(tipo=="char"){
Queue<char> A(N);
for(int i=0; i<N; i++){
infile>> operazione;
if(operazione=="dequeue")
A.dequeue();
else
{
char elem=(char)(operazione[1]);
A.enqueue(elem);
}
}
A.Stampa();
}
c++;
}
}
答案 0 :(得分:0)
您的第一个问题是初始化过程。
#define WINVER 0x0A00
#define _WIN32_WINNT 0x0A00
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main()
{
long ram;
BOOL Checkram;
Checkram = GetPhysicallyInstalledSystemMemory(&ram);
printf("Installed RAM is: %lu", ram);
return 0;
}
int lunghezza;
Queue(int l){
lunghezza=l;
};
Pila<V> A= Pila <V>(lunghezza);
Pila<V> B= Pila <V>(lunghezza);
和A
将使用尚未初始化的值B
进行初始化。这样,您可以获得分配大量内存的很高的价值。
这部分的一个更好的实现是使用初始化器
lunghezza
您的第二个问题是在int lunghezza;
Queue(int l) : lunghezza(l), A(l), B(l)
{
}
Pila<V> A;
Pila<V> B;
类中。
Pila
在此代码中,Tab从不释放,因此当对象被销毁时,您将泄漏(释放)分配的内存。您必须在析构函数中调用Pila(int L){
lunghezza=L;
Tab= new T[L];
cima=lunghezza;
}
。
您还可以使用delete[] Tab;
或std::list
之类的STL类来替换您的std::vector
类。