Erik G Holmes
Erik G Holmes

Reputation: 7

MultiMap not Printing List

I am having 2 issues with my code.

The 1st issue is that my multimap is not printing, and I don't know why.

The 2nd issue is that I don't know how to create a function to search and find a specific item in my multimap.

You can change as much of the code as you want, but I need to keep the class or change it to a struct.

#include<iostream>
#include<string> 
#include<iterator>
#include<map>
#include<algorithm>
#include<iomanip>
using namespace std;

class SongNode {
public:
    string title;
    string artist;
    float rating;
};

//Constants
#define INFINITE_LOOP 1
#define LEFT_JUSTIFIED 30

//Prototypes

void sortByArtist(multimap<string, SongNode>& newSongNode); 
void sortByRating(multimap<string, SongNode>& newSongNode); 


//FUNCTION      : void sortByArtist
//PARAMETER     : multimap<string, SongNode>&newSongNode
//RETURN        : void
//DESCRIPTION   : This function will sort the multimap by the artist of the song
void sortByArtist(multimap<string, SongNode>&newSongNode) {
    multimap<string, SongNode>temp; 

    for (auto i = newSongNode.begin(); i != newSongNode.end(); i++) 
        temp.insert(pair<string, SongNode>(i->second.artist, i->second)); 
    newSongNode.clear(); 

    for (auto i = temp.begin(); i != temp.end(); i++)
        newSongNode.insert(pair<string, SongNode>(i->second.artist, i->second)); 
    temp.clear(); 
}

//FUNCTION      : void sortByRating
//PARAMETER     : (multimap<string, SongNode>& newSongNode
//RETURN        : void
//DESCRIPTION   : This function will sort the multimap by the rating. 
void sortByRating(multimap<string, SongNode>& newSongNode) {

    multimap<float, SongNode, greater<int>> temp; 

    for (auto i = newSongNode.begin(); i != newSongNode.end(); i++)
        temp.insert(pair<int, SongNode>(i->second.rating, i->second)); 
    newSongNode.clear(); 

    for (auto i = temp.begin(); i != temp.end(); i++)
        newSongNode.insert(pair<string, SongNode>(" ", i->second)); 
    temp.clear(); 
}
    
int main() {

    multimap<string, SongNode> songList; 
    multimap<string, SongNode>::iterator itr; 
    string title; 
    string artist; 
    int rating; 
    SongNode* newSongNode = new SongNode; 

    cout << "Please enter a title artist and rating\n"; 

    while (INFINITE_LOOP) {
        cout << "Title: "; 
        cin >> title;

        if (title == ".") {
            break; 
        }

        cout << "Artist: "; 
        cin >> artist; 

        cout << "Rating: ";
        cin >> rating; 

        //Error check  for rating 
        while (INFINITE_LOOP) {     

            if (rating < 1) {
                cout << "The rating you have entered is less then 1\n";
                cout << "Rating: ";
                cin >> rating;
                break;
            }

            else if (rating > 5) {
                cout << "The rating you have to enterd is greater then 5\n";
                cout << "Rating: ";
                cin >> rating;
                break; 
            }

            else
                break;
        }

        SongNode* newNode = new SongNode; 

        newNode->title = title;
        newNode->artist = artist; 
        newNode->rating = rating; 

        songList.insert(pair<string, SongNode>(title, *newSongNode));
    }

    //display the two lists here. 
    cout << "Artist Sorted List\n"; 
    sortByArtist(songList); 
    for (itr = songList.begin(); itr != songList.end(); ++itr) {
        cout << "Title" << left << setw(LEFT_JUSTIFIED) << itr->second.title; 
        cout << "Artist" << left << setw(LEFT_JUSTIFIED) << itr->second.artist; 
        cout << "Rating" << left << setw(LEFT_JUSTIFIED) << itr->second.rating<<endl; 
    }

    cout << "\n"; 
    cout << "Rating Sorted List\n"; 
    sortByRating(songList); 

    delete newSongNode; 
    return 0;
}

Upvotes: 0

Views: 59

Answers (2)

Remy Lebeau
Remy Lebeau

Reputation: 595817

You are not populating the songList with the SongNode objects that you fill with data. You have an extra SongNode that has no data in it, which is the only object you are putting into the songList. So there is nothing to print.

Try this instead:

#include <iostream>
#include <string> 
#include <iterator>
#include <map>
#include <algorithm>
#include <iomanip>
#include <limits>
using namespace std;

struct SongNode {
    string title;
    string artist;
    float rating;
};

//Constants
#define INFINITE_LOOP 1
#define LEFT_JUSTIFIED 30

//Prototypes

void sortByArtist(multimap<string, SongNode>& newSongNode); 
void sortByRating(multimap<string, SongNode>& newSongNode); 


//FUNCTION      : void sortByArtist
//PARAMETER     : multimap<string, SongNode>&newSongNode
//RETURN        : void
//DESCRIPTION   : This function will sort the multimap by the artist of the song
void sortByArtist(multimap<string, SongNode> &newSongNode) {
    multimap<string, SongNode> temp; 

    for (auto &elem : newSongNode) 
        temp.insert(make_pair(elem.second.artist, elem.second)); 
    newSongNode.clear(); 

    for (auto &elem : temp)
        newSongNode.insert(make_pair(elem.second.artist, elem.second)); 
}

//FUNCTION      : void sortByRating
//PARAMETER     : (multimap<string, SongNode>& newSongNode
//RETURN        : void
//DESCRIPTION   : This function will sort the multimap by the rating. 
void sortByRating(multimap<string, SongNode>& newSongNode) {

    multimap<float, SongNode, greater<int>> temp; 

    for (auto &elem : newSongNode)
        temp.insert(make_pair(elem.second.rating, elem.second)); 
    newSongNode.clear(); 

    for (auto &elem : temp)
        newSongNode.insert(make_pair(" ", elem.second)); 
}
    
int main() {

    multimap<string, SongNode> songList; 
    string title, artist;
    float rating; 

    cout << "Please enter a title artist and rating\n"; 

    while (INFINITE_LOOP) {
        cout << "Title: "; 
        cin >> title;

        if (title == ".") {
            break; 
        }

        cout << "Artist: "; 
        cin >> artist; 

        cout << "Rating: ";
        cin >> rating; 

        //Error check for rating
        while (INFINITE_LOOP) {     
            if (!cin) {
                cin.clear();
                cin.ignore(numeric_limits<streamsize>::max(), '\n');
                cout << "The rating you have entered is invalid\n";
            }
            else if (rating < 1.0f) {
                cout << "The rating you have entered is less then 1\n";
            }
            else if (rating > 5.0f) {
                cout << "The rating you have to entered is greater then 5\n";
            }
            else
                break;

            cout << "Rating: ";
            cin >> rating;
        }

        SongNode newNode; 

        newNode.title = title;
        newNode.artist = artist; 
        newNode.rating = rating; 

        songList.insert(make_pair(title, newNode));
    }

    //display the two lists here. 

    cout << "Artist Sorted List\n"; 
    sortByArtist(songList); 
    for (auto &elem : songList) {
        cout << "Title" << left << setw(LEFT_JUSTIFIED) << elem.second.title; 
        cout << "Artist" << left << setw(LEFT_JUSTIFIED) << elem.second.artist; 
        cout << "Rating" << left << setw(LEFT_JUSTIFIED) << elem.second.rating << endl; 
    }
    cout << "\n";

    cout << "Rating Sorted List\n"; 
    sortByRating(songList); 
    for (auto &elem : songList) {
        cout << "Title" << left << setw(LEFT_JUSTIFIED) << elem.second.title; 
        cout << "Artist" << left << setw(LEFT_JUSTIFIED) << elem.second.artist; 
        cout << "Rating" << left << setw(LEFT_JUSTIFIED) << elem.second.rating << endl; 
    }
    cout << "\n";

    return 0;
}

Upvotes: 1

Dmitry Kuzminov
Dmitry Kuzminov

Reputation: 6584

First of all, you have two variables with similar names, and you definitely misuse them:

    SongNode* newSongNode = new SongNode; 
    // ...
    SongNode* newNode = new SongNode; 
   
    newNode->title = title;
    newNode->artist = artist; 
    newNode->rating = rating; 

    songList.insert(pair<string, SongNode>(title, *newSongNode));

You are initializing the newNode but inserting the newSongNode. The values are initialized with empty strings, so that may explain no printing.

As for "searching in a multimap" be more specific in what your problem is.

Upvotes: 1

Related Questions