【學習筆記】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++高階程式設計:STL:Map 和 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中的熵編碼基本方法: 熵編碼具有消除數據之間統計冗余的功能,在編碼端作為最後一道工序,將語法元素寫入輸出碼流 熵解碼作為解碼過程的第一步,將碼流解析出語法元素供後續步驟重建圖像使用