C++中multimap和map容器及使用

map/multimap容器裏存放的都是pair模板類的對象,而且按照first成員從小到大排序。

1. pair模板

pair模板類的定義如下,其中有兩個成員變量:first和second:
在這裏插入圖片描述

2. multimap模板類

template<class Key, class T, class Pred=less<Key>, class A=allocator<T> >
class multimap{
...
typedef pair<const Key,T> value_type;
...
};

可以看到,mutimap中元素都是由pair對象,其中first爲關鍵字,second爲值,其類型爲Key。在模板類裏定義了value_type類型用於創建pair類的對象。

3. multimap的一個例子

這是我根據視頻里老師示範的例子,改動了一下。這個例子如下:


一個商品信息錄入和查詢系統,信息包括:庫存數,商品名稱,商品價格。
輸入格式如下:
添加:ADD num item price;範例:ADD 20 JUICE 3(表示加入20個果汁,單價3元)
查詢:QUERY num;範例:QUERY 10(查詢所有庫存小於10,且價格最高的商品信息,如果有多個商品都滿足,則輸出全部符合條件的,若沒有則輸出“Not Found!”)


考慮到multimap中都是pair的對象,只有first和second成員變量,而且查詢是以庫存爲目標,所以我們把庫存作爲first成員,而把商品名稱和價格都放在一個結構體中,共同作爲second成員。

  • 建立商品信息類:
class Item {
public:
	struct Item_info {
		string Item_name;
		int Item_price;
	};
	int Item_stock;
	Item_info info;		//	info共同作爲pair中的second成員
};
  • 建立multimap容器:
typedef multimap<int, Item::Item_info> ITEM_MAP;
  • 商品信息添加:
		if (cmd == "ADD") {
			cin >> it.Item_stock >> it.info.Item_name >> it.info.Item_price;
			itmp.insert(ITEM_MAP::value_type(it.Item_stock, it.info));	//value_type是pair類
		}
  • 商品信息查詢:
		//**查詢
		if (cmd == "QUERY") {
			int stock_limit;
			cin >> stock_limit;
			ITEM_MAP::iterator sp = itmp.lower_bound(stock_limit);
			if (sp != itmp.begin()) {
				ITEM_MAP::iterator sp_st=--sp;
				//**尋找庫存及價格都相等的商品
				int stock_max = sp->first;
				int price_max = sp->second.Item_price;
				cout << "Find Stock < " << stock_limit << "with max price: " << endl;
				for (;sp!=(itmp.begin())&&(sp->first == stock_max) ;--sp) {
					if (sp->second.Item_price > price_max)
						price_max = sp->second.Item_price;
				}
				for (;sp_st != (itmp.begin()) && (sp_st->first == stock_max)&&(sp_st->second.Item_price==price_max);--sp_st) {
					cout << sp_st->first << " " << sp_st->second.Item_name << " " << sp_st->second.Item_price << endl;
				}
				//for循環終止的原因可能是--sp等於begin,這時候需要判斷begin對應的值大小關係
				if (sp == itmp.begin()) {
					if((sp->first == stock_max) && (sp->second.Item_price == price_max))
						cout << sp->first << " " << sp->second.Item_name << " " << sp->second.Item_price << endl;
				}
			}
			else
			{
				cout << "Not Found!" << endl;
			}
			}
  • 運行結果:
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章