0% found this document useful (0 votes)
51 views4 pages

Multisets and Multimaps

Multisets allow duplicate elements and keep track of the number of occurrences of each element, similar to a map with an integer count. A multimap also allows duplicate keys but stores multiple values per key. The document provides an example using a multimap to store inventory of products for a shop, with the product name as the key and product object as the value. A multiset tracks product codes that have been sold. Functions are demonstrated to sell products, list sold items, and calculate total sales. While not strictly required, multimap allows storing multiple products with the same name in this example.

Uploaded by

Eka Kurniawan
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
51 views4 pages

Multisets and Multimaps

Multisets allow duplicate elements and keep track of the number of occurrences of each element, similar to a map with an integer count. A multimap also allows duplicate keys but stores multiple values per key. The document provides an example using a multimap to store inventory of products for a shop, with the product name as the key and product object as the value. A multiset tracks product codes that have been sold. Functions are demonstrated to sell products, list sold items, and calculate total sales. While not strictly required, multimap allows storing multiple products with the same name in this example.

Uploaded by

Eka Kurniawan
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 4

Multisets and Multimaps

I was trying to understand where multisets would be used as compared to multimaps and I didnt find any straightforward answer. I found this simple explanation at StackOverflow:

multimap y With ZIP code as a key, all people which have that ZIP code y With account ID as key, all open orders of that person/account y A dictionary, with per keyword various explanations multiset is in essence a map with a key and a integer count.
y y

The inventory of a shop, all products have their key and the amount still available is the value accumulated sales data of a shop, every time a product is sold the product id get's added to the multiset thereby increasing the amount sold

As a result I created this example below. This is probably not the best of examples but I didnt want to change it. The main problem below is that multimap's are not strictly speaking required in the example below. I could have used a map. Multimap would be needed if there was no quantity_ in the class and then I can add the products one by one. I could have then used the count method to get the quantity.

Anyway, program as follows:

//Program tested on Microsoft Visual Studio 2008 - Zahid Ghadialy //Simple example of multiset #include <iostream> #include <string> #include <set> #include <map> #include <algorithm> using namespace std; class Product //Keeping this simple { public: Product(string name, int code, int price) :

name_(name), productCode_(code), price_(price) { quantity_ = 10; //Lets fix this value for simplicity } bool availableForSale() { if(quantity_ > 0) { quantity_--; return true; } return false; } string name_; int productCode_; int price_; int quantity_; private: Product(); //Disabled the default constructor }; void sellProduct(string name, multimap<string, Product*>& inventory, multiset <int> &soldItems) { multimap<string, Product*>::iterator it = inventory.find(name); if(it != inventory.end()) { if ((*it->second).availableForSale()) { soldItems.insert((*it->second).productCode_); } } else { cout << "Unknown product : " << name << endl; } } void soldItemsList(multimap<string, Product*>& inventory, multiset <int> &soldItems) {

multimap<string, Product*>::iterator it = inventory.begin(); for(it = inventory.begin(); it != inventory.end(); ++it) { int soldCount = soldItems.count((*it->second).productCode_); cout<<"Product = " << (*it->second).name_ << ", Quantity Sold = " << soldCount << endl; } } int checkSales(multimap<string, Product*>& inventory, multiset <int> &soldItems) { int totalSales = 0; multimap<string, Product*>::iterator it; for(it = inventory.begin(); it != inventory.end(); ++it) { int soldCount = soldItems.count((*it->second).productCode_); totalSales += soldCount * (*it->second).price_; } return totalSales; } int main() { //There is no special reason to use multimap instead of a map //If you wanted to add same product and create quantity multimap is required multimap<string, Product*> inventory; Product* prod1 = new Product("product1", 2334, 10); Product* prod2 = new Product("product2", 4556, 50); inventory.insert(pair<string, Product*>("product1",prod1)); inventory.insert(pair<string, Product*>("product2",prod2)); multiset <int> soldItems; sellProduct("product1", inventory, soldItems); sellProduct("product2", inventory, soldItems); sellProduct("apple", inventory, soldItems); sellProduct("product1", inventory, soldItems); sellProduct("product1", inventory, soldItems); sellProduct("product2", inventory, soldItems);

soldItemsList(inventory, soldItems); cout<<"Total sales = " << checkSales(inventory, soldItems) << endl; delete prod1; delete prod2; return 0; }

The output as follows:

Posted by Zahid Ghadialy at 06:14 0 comments

You might also like