Click here to Skip to main content
15,892,161 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
My program has a priority_queue that doesn't work correctly ! when I pop element from that priority_queue return element with out any order!

I write two class , first class is parent of second class.

first class:

C++
//===========================================
class treeNode
{
public:
	treeNode();	//constructor
	treeNode(int );	//constructor
	virtual void display(void) const;	//show tree object in terminal
	friend bool operator <(const treeNode &, const treeNode &);
	friend bool operator >(const treeNode &, const treeNode &);

	int iterate;
	treeNode *left;
	treeNode *right;
};

treeNode::treeNode()
{
	iterate = 1;
	left = NULL;
	right = NULL;
}

treeNode::treeNode(int i)
{
	iterate = i;
	left = NULL;
	right = NULL;
}


bool operator <(const treeNode &a, const treeNode &b)
{
	if (a.iterate < b.iterate)
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool operator >(const treeNode &a, const treeNode &b)
{
	if (a.iterate > b.iterate)
	{
		return true;
	}
	else
	{
		return false;
	}
}

void treeNode::display(void) const
{
	std::cout << iterate << endl;
}


second class:

C++
//===========================================

class letter : public treeNode
{
public:
	letter();		//constructor
	letter(char);	//constructor
	letter(char, int);	//constructor
	friend bool operator <(const letter &, const letter &);
	friend bool operator >(const letter &, const letter &);
	void display(void) const;	//show letter object in terminal

	char character;
};

letter::letter() : treeNode()
{
}

letter::letter(char ch) : character(ch), treeNode(1)
{
}

letter::letter(char ch, int i) : character(ch), treeNode(i)
{
}

bool operator <(const letter &a, const letter &b)
{
	if (a.iterate < b.iterate)
	{
		return true;
	}
	else
	{
		return false;
	}
}

bool operator >(const letter &a, const letter &b)
{
	if (a.iterate > b.iterate)
	{
		return true;
	}
	else
	{
		return false;
	}
}


void letter::display(void) const
{
	if (character == '\n')
	{
		std::cout << setw(8) << "new line" << " , " << setw(6) << iterate << endl;
	}
	else
	{
		if (character == ' ')
		{
			std::cout << setw(8) << "space" << " , " << setw(6) << iterate << endl;
		}
		else
		{
			std::cout << setw(8) << character << " , " << setw(6) << iterate << endl;
		}
	}
}
//===========================================



I write below function for read a file to understand number of iteration of each character that exist in file , it work correctly and I use that in next function.

C++
//===========================================
//read file and find number of iterate for each char
map< char, letter > countEachLetterInFile(string addOfFile)
{
	string str;
	letter *tempLetter;
	map < char, letter > letterMap;
	map < char, letter >::iterator mapIter;
	ifstream fp(addOfFile, ios::in);

	//check validatly of file and path of file
	if (!fp)
	{
		cerr << "something wrong while opening file!" << endl;
		exit(1);
	}
	
	//read file line by line
	while (getline(fp, str))
	{
		str += '\n';
		//move in string character by character
		for (int i = 0; i < str.size(); i++)
		{
			
			mapIter = letterMap.find(str.at(i));
			
			if (mapIter == letterMap.end())
			{
				tempLetter = new letter(str.at(i));
				letterMap[str.at(i)] = *tempLetter;
				delete[]tempLetter;
			}
			else
			{
				letterMap[str.at(i)].iterate++;
			}		
		}
	}

	mapIter = letterMap.find('\n');

	if (mapIter != letterMap.end())
	{
		letterMap['\n'].iterate--;
	}

	return letterMap;
}



problem occur in this function , in this function is a priority_queue of treeNode * .
I fill that with a map (output of previous function , values in map are correct and hasn't any problem) .

C++
//===========================================
//make huffman tree and return <char , string> and save <string , char> in file
map < char, string > makeHuffmanTree(map< char, letter > mapOfLetter)
{
	treeNode *tempTreeNode;
	map < char, string > huffmanCode;
	map < char, letter >::iterator mapIter;
	
	priority_queue<treeNode *, vector<treeNode *>, greater<treeNode *> > letterPriorityQueue;
	
	for (mapIter = mapOfLetter.begin(); mapIter != mapOfLetter.end(); mapIter++)
	{
		letterPriorityQueue.push( new letter(mapIter->second.character, mapIter->second.iterate));	
	}
	
	//
	//wrong order !!
	//
	//
	std::cout << letterPriorityQueue.size() << endl;
    int size = letterPriorityQueue.size();
	for (int i = 0; i < size; i++)
	{
		letterPriorityQueue.top()->display();
		letterPriorityQueue.pop();
	}

	/*while (letterPriorityQueue.size() > 2)
	{

	}*/

	return huffmanCode;
}


values in map :

http://open-mind.ir/wp-content/uploads/2015/03/11.png[^]

when I read priority_queue :

http://open-mind.ir/wp-content/uploads/2015/03/2.png[^]
Posted
Updated 18-Mar-15 3:36am
v3

1 solution

You are comparing pointers.
Try this code:
C++
#include <iostream>
#include <vector>
#include <queue>
using namespace std;


class Letter
{
  char c;
  int refs;
  public:
    Letter(char c, int refs):c(c),refs(refs){}
    void show(){cout << c << " " << refs << endl;}
  friend bool operator > (const Letter &a, const Letter & b);
  friend class CmpLetter;
};

bool operator > (const Letter &a, const Letter & b)
{
  return (a.refs > b.refs);
}

class CmpLetter
{
public:
  bool operator () ( Letter * const & pa, Letter * const & pb) const
  {
    return (pa->refs > pb->refs);
  }
};

int main()
{

  priority_queue< Letter *, vector<Letter*>, greater<Letter*> > pq1;
  priority_queue< Letter *, vector<Letter*>, CmpLetter > pq2;

  pq1.push(new Letter('a',5) );
  pq1.push(new Letter('z',6) );
  pq1.push(new Letter('i',10) );
  pq1.push(new Letter('c',3) );

  pq2.push(new Letter('a',5) );
  pq2.push(new Letter('z',6) );
  pq2.push(new Letter('i',10) );
  pq2.push(new Letter('c',3) );

  cout << "pq1" << endl;
  while (pq1.size()>0)
  {
    pq1.top()->show();
    pq1.pop();
  }
  
  cout << "pq2" << endl;
  while (pq2.size()>0)
  {
    pq2.top()->show();
    pq2.pop();
  }
}
 
Share this answer
 
Comments
farhad bat 18-Mar-15 15:42pm    
I wrote my program in visual C++ ,My code acted in correct way when I tested that in another compilers!

my problem fix when I use your second approach in visual c++!
CPallini 18-Mar-15 16:29pm    
Very strange, I tested the code using g++.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900