Search code examples
c++stliteratorcontainersmultimap

How to fix the position for the text in the output C++,STL


I need to print the original text in DisplayOriginalText() after finding KnownWords and UnknownWords. Everything is working perfectly fine but there is a little mistake in my output. The compiler places the last word of the original text to the first word of the OriginalText. I am giving an example in the output to make it more clear. Can someone figure out what is the issue and how to correct that ?

My output:

expensive this is my car and this is so much

Required output:

this is my car and this car is so much expensive

Note: This is just an example. Original text is an article for about 500 words.

Header file:

typedef map<string, vector<int> > WordMap;
typedef WordMap::iterator WordMapIter;

class WordStats
{
public:
    WordStats();
    void ReadDictionary();
    void DisplayDictionary();
    void ReadTxtFile();
    void DisplayKnownWordStats();
    void DisplayUnknownWordStats();
    void DisplayMostFreqKnownWords();
    void DisplayMostFreqUnknownWords();
    void DisplayOriginalText();
private:
    WordMap KnownWords;
    WordMap UnknownWords;
    set<string> Allwords;
    WordMapIter Paragraph;
    set<string> Dictionary;
    char Filename[256];

    //add your private fns here
    string parse_word(string word);
    void DisplayWordStats(WordMap &WMap);

};

My program:

void WordStats::DisplayOriginalText(){
    std::map<int,string> txt_map;
    std::map<int,string>::iterator mit;

    /// insert all known words
    for (WordMapIter it = KnownWords.begin(); it != KnownWords.end(); it++)
    for (vector<int>::iterator pos_it = it->second.begin(); pos_it != it- 
    >second.end(); pos_it++ )
        txt_map.insert(std::pair<int,string>(*pos_it, it->first) );


    /// insert all unknown words
    for (WordMapIter it = UnknownWords.begin(); it != UnknownWords.end(); 
    it++)
    for (vector<int>::iterator pos_it = it->second.begin(); pos_it != it- 
    >second.end(); pos_it++ )
        txt_map.insert(std::pair<int,string>(*pos_it, it->first) );

    cout << endl << "       - Original Text -" << endl << endl;

    for (mit = txt_map.begin(); mit != txt_map.end(); ++mit) 
    cout << mit->second << " ";

    cout << endl;   
}   

Solution

  • void WordStats::DisplayOriginalText(){
    std::map<int,string> mtext;
    std::map<int,string>::iterator miter;
    vector<int>::iterator v_iter;
    
    // inserting known words
    for (Paragraph = KnownWords.begin(); Paragraph != KnownWords.end(); Paragraph++)
    {
        for ( v_iter = Paragraph->second.begin(); v_iter != Paragraph->second.end(); v_iter++ )
        {
            mtext.insert(std::pair<int,string>(*v_iter, Paragraph->first) );
        }
    }
    /// inserting unknown words
    for (Paragraph = UnknownWords.begin(); Paragraph != UnknownWords.end(); Paragraph++)
    {
        for ( v_iter = Paragraph->second.begin(); v_iter != Paragraph->second.end(); v_iter++ )
        {
            mtext.insert(std::pair<int,string>(*v_iter, Paragraph->first) );
        }
    }
    cout <<"\n         ";
    cout << "--- Original Text ---\n\n";
    
    for (miter = mtext.begin(); miter != mtext.end(); ++miter) 
    {
        cout << miter->second << " ";
    }   
    cout << endl;   
    }