1. 程式人生 > >【學習筆記】C++高階程式設計:STL:Map 和 Multimap

【學習筆記】C++高階程式設計:STL:Map 和 Multimap

Map 和 Multimap

Multimap的簡單例子程式碼:

#include <iostream>
#include <map>
using namespace std;
int main(){
	typedef multimap<int ,double, less <int> > mmid;
	mmid pairs;
	cout<<"1)"<<pairs.count(15)<<endl;
	pairs.insert(mmid::value_type(15,2.7));
	pairs.insert(mmid::value_type(15,99.3));
	cout<<"2)"<<pairs.count(15)<<endl;
	pairs.insert(mmid::value_type(30,111.11));
	pairs.insert(mmid::value_type(10,22.22));
	pairs.insert(mmid::value_type(25,33.333));
	pairs.insert(mmid::value_type(20,9.3));
	for(mmid::const_iterator i=pairs.begin();i!=pairs.end();i++){
		cout<<"("<<i->first<<","<<i->second<<")"<<",";
	}
	return 0;
}

輸出:

1)0

2)2

(10,22,22),(15,2.7),(15,99.3),(20,9.3),(25,33.333),(30,111.11)

Multimap實際應用舉例:

一個學生成績錄入和查詢系統,接收一下兩種輸入:

Add name id score

Query score

Name是一個字串,中間沒有空格,代表學生姓名,id是一個整數,代表學號,score是一個整數,表示分數。學號不能重複,分數和姓名都可能重複。

兩種輸入交替出現。第一中輸入表示要新增一個學生的資訊,碰到這種輸入,就記錄下學生的姓名,id和分數。第二中輸入表示要查詢,碰到這樣的輸入就輸出已有記錄中分數比score低的最高分獲得者的姓名、學號、分數。如果有多個學生都滿足條件,就輸出學號最大的那個學生的資訊。如果找不見到滿足條件的學生,則輸出“Nobody”。

輸入樣例:

Add Jack 12 78

Query 78

Query 81

Add Percy 9 81

Add Marry 8 81

Query 82

Add Tom 11 79

Query 80

Query 81

輸出樣例:

Nobody

Jack 12 78

Percy 9 81

Tom 11 79

Tom 11 79

參考程式碼:

#include <iostream>
#include <map>
#include <string>
using namespace std;

class CStudent{
	public:
		struct CInfo{
			//類的內部還可以定義類 
			int id;
			string name;
		};
		int score;
		CInfo info;//學生的其他資訊 
};
typedef multimap<int, CStudent::CInfo>MAP_STD;

int main(){
	MAP_STD mp;
	CStudent st;
	string cmd;
	while(cin>>cmd){
		if(cmd=="Add"){
			cin>>st.info.name>>st.info.id>>st.score;
			mp.insert(MAP_STD::value_type(st.score,st.info));
		}else if(cmd=="Query"){
			int score;
			cin>>score;
			MAP_STD::iterator p=mp.lower_bound(score);
			//查詢一個最大的位置it,是的[begin(),it)中所有元素的first都比value小。 
			if(p!=mp.begin()){
				--p;
				score=p->first;
				//比要查詢分數低的最高分 
				MAP_STD::iterator maxp=p;
				int maxId=p->second.id;
				for(;p!=mp.begin()&&p->first==score;--p){
					//遍歷所有成績和score相等的學生 
					if(p->second.id>maxId){
						maxp=p;
						maxId=p->second.id;
					}
				}
				if(p->first==score){
					//如果上面迴圈是因為p==mp.begin()
					//而終止,則p指向的元素還要處理 
					if(p->second.id>maxId){
						maxp=p;
						maxId=p->second.id;
					}
				}			
				cout<<maxp->second.name<<" "<<maxp->second.id<<" "<<maxp->first<<endl;
			}else
			//lower_bound的結果就是begin,說明沒人分數比查詢分數低 
				cout<<"Nobody"<<endl;
				
		}
	}
	return 0;
}


Map的[ ]成員函式

若pairs為map模板類的物件,pairs[key]返回對關鍵字等於key的元素的值(second成員變數)的引用。若沒有關鍵字為key的元素,則會往pairs裡插入一個關鍵字為key的元素,其值用無引數建構函式初始化,並返回其值的引用。

如:

Map<int ,double> pairs;

Pairs[50]=5; 會修改pairs中關鍵字為50的元素,使其值變成5、

若不存在關鍵字等於50的元素,則插入此元素,並使其值變為5.

Map示例

#include <iostream>
#include <map>
using namespace std;
template<class Key,class Value>
ostream & operator <<(ostream & o ,const pair<Key,Value> &p){
	o<<"("<<p.first<<","<<p.second<<")";
	return o;
}
int main(){
	typedef map<int ,double,less<int> > mmid;
	mmid pairs;
	cout<<"1)"<<pairs.count(15)<<endl;
	pairs.insert(mmid::value_type(15,2.7));
	pairs.insert(make_pair(15,99.3));
	cout<<"2)"<<pairs.count(15)<<endl;
	pairs.insert(mmid::value_type(20,9.3));
	mmid::iterator i;
	cout<<"3)";
	for(i=pairs.begin();i!=pairs.end();i++){
		cout<<*i<<",";
	}
	cout<<endl;
	cout<<"4)";
	int n=pairs[40];//如果沒有關鍵字為40的元素,則插入一個
	for(i=pairs.begin();i!=pairs.end();i++){
		cout<<*i<<",";
	} 
	cout<<endl;
	cout<<"5)";
	pairs[15]=6.28;
	for(i=pairs.begin();i!=pairs.end();i++){
		cout<<*i<<",";
	}
	cout<<endl;
	return 0;
}


輸出:

1)0

2)1

3)(15,2.7),(20,9.3),

4)(15,2.7),(20,9.3),(40,0),

5)(15,6.28),(20,9.3),(40,0),

相關推薦

學習筆記C++高階程式設計STLMap Multimap

Map 和 Multimap Multimap的簡單例子程式碼: #include <iostream> #include <map> using namespace std; int main(){ typedef multimap<i

學習筆記C++之類的繼承例項日期操作

定義日期類Date,實現: 通過加減天數操作獲得新的日期; 通過兩個日期相減獲得相隔天數。 定義WDate類,繼承Date類,且: 包含星期幾資訊; 對顯示日期的成員函式進行修改。 //================================== //Date

學習筆記C# 構造析構

成員 int 學習 pri [] func 釋放內存 ring 銷毀 構造方法 構造方法是一個特殊的方法,負責初始化對象 構造方法名必須和類名一致 構造方法沒有返回值,但可以有參數,能夠重載 構造方法可以不寫,系統會自動為類添加一個無參的默認構造 如果將構造方法設置為P

學習筆記C# 靜態類

實例化 namespace [] line str 過程 ole test 數據 靜態修飾符 用static修飾的成員是靜態成員 靜態成員只能由類來調用 用static修飾的類是靜態類 靜態類不能實例化,只能包含靜態成員和const常量 在內存中一共有五個區域 1

學習筆記C# 接口

apple [] oat 訪問 names 使用 foo pub 修飾 使用interface關鍵字定義接口 接口定義一組成員但不直接實現它們 實現接口 實現接口的任何類都必須實現其所有的成員方法 接口不能直接實例化 接口可以包含方法和屬性聲明,不能包含字段 接口中所有

學習筆記C# ArrayList

tde 獲取 style demo key ren mov cnblogs content 集合 集合是種容器,在程序中,使用集體管理相關對象組 集合分為非泛型集合和泛型集合 非泛型集合 使用非泛型集合需要引入命名空間System.Collections Arra

學習筆記C# 字典

鍵值對 保存 包含 ear 是否 nod 對象 命名空間 不包含 字典 Dictionary是存儲鍵和值的集合 Dictionary是無序的,鍵Key是唯一的 使用時,首先要引入泛型集合命名空間 using System.Collections.Generic;

學習筆記演算法導論第2章演算法基礎

//====================================== //Ch2_1_Basic_Sort_Algorthm //====================================== #include<iostream> #

閱讀筆記JavaScript 高階程式設計(四)

基本型別和引用型別的值   ECMAScript 變數可能包含兩種不同資料型別的值:基本型別值和引用型別值。 基本型別值是指簡單的資料段,而引用型別值指那些可能由多個值構成的物件。   JavaScript 的基本資料型別都是按值訪問的,因為可以操作儲存在

學習筆記c++ 類 過載運算子

最近學校C++學到了類,要求自己實現一個向量類,做了一部分典型的過載運算子,以作筆記。 本類Vector對應的是一個向量,通過一個長度為n的陣列(為了簡化而取int)對應n維向量。 class Vector{//首先是類申明,用的建構函式是預設建構函式,

學習筆記 唐大仕—Java程式設計 第5講 深入理解Java語言之5.7 其他幾個高階語法

/** * 其他幾個高階語法 學習筆記 * @author cnRicky * @date 2018.11.11 */   其他幾個高階語法 新的語法 從JDK1.5起,增加了一些新的語法 大部分是編譯器自動翻譯的,稱為Complier sugar("糖"用起來很方便,但

學習筆記面向物件的程式設計——理解JS中的物件屬性、建立物件、JS中的繼承

  ES中沒有類的概念,這也使其物件和其他語言中的物件有所不同,ES中定義物件為:“無序屬性的集合,其屬性包含基本值、物件或者函式”。現在常用的建立單個物件的方法為物件字面量形式。在常見多個物件時,使用工程模式的一種變體。 1.理解物件   1)物件的屬性分兩種:資料屬性和訪問器屬性,每個型別的屬性都具有

學習筆記演算法競賽chapter 2 迴圈結構程式設計

對於大部分人來說這部分都不陌生,我也就不再贅述,只寫出一些本書中提到的編寫迴圈結構程式時的需要注意的地方。 1、for迴圈的格式為:for( 初始化;條件;調整 )    迴圈體; 2、儘管for迴圈反覆執行相同的語句,但這些語句每次的執行效果往往不同。 3、編寫程式時,要

C++ Primer學習筆記第三章標準庫型別之bitset型別

#include <iostream> #include <bitset> using namespace std; int main() { bitset<32> bitvec; int a = 0, b = 1; i

Python學習筆記python高階特性列表生成式

【根據廖雪峰python教程整理】 一、列表生成式 列表生成式即List Comprehensions,是Python內建的非常簡單卻強大的可以用來建立list的生成式。 舉個例子,要生成lis

學習筆記關於DOM4J使用DOM4J解析XML文檔

文本 class 中產 獲取 ber exce int() logs hone 一、概述 DOM4J是一個易用的、開源的庫,用於XML、XPath和XSLT中。采用了Java集合框架並完全支持DOM、SAX、和JAXP。 DOM4J最大的特色是使用大量的接口,主要接口都在o

學習筆記String進階StringBuffer類(線程安全)StringBuilder類

n) static this util double 字符串 對象 ice 單線程 一、除了使用String類存儲字符串之外,還可以使用StringBuffer類存儲字符串。而且它是比String類更高效的存儲字符串的一種引用數據類型。 優點:   對字符串進行連接操作時,

學習筆記2017年7月18日MySQL測試模擬QQ數據庫

關系 ref sts one database 等級 weight insert phone 模擬測試: QQ數據庫管理 一、創建數據庫並添加關系和測試數據 1 ##創建QQ數據庫,完成簡單的測試 2 3 #創建數據庫 4 DROP DATABASE IF EX

視頻編解碼·學習筆記7. 熵編碼算法基礎知識 & 哈夫曼編碼

html 節點 表示 效率 article tchar vector nod code 一、熵編碼概念: 熵越大越混亂 信息學中的熵: 用於度量消息的平均信息量,和信息的不確定性 越是隨機的、前後不相關的信息,其熵越高 信源編碼定理: 說明了香農熵越信源符號概率之間的

視頻編解碼·學習筆記8. 熵編碼算法基本算法列舉 & 指數哥倫布編碼

方法 mark enter 協議 int 十進制數 pan 進制數 tab 一、H.264中的熵編碼基本方法: 熵編碼具有消除數據之間統計冗余的功能,在編碼端作為最後一道工序,將語法元素寫入輸出碼流 熵解碼作為解碼過程的第一步,將碼流解析出語法元素供後續步驟重建圖像使用