1. 程式人生 > >學習筆記 c++ (map 對映)

學習筆記 c++ (map 對映)

對映(map)

  • 對映與集合同屬於單重關聯容器,它們的主要區別在於,集合的元素型別是鍵本身,而對映的元素型別是由鍵和附加資料所構成的二元組。
  • 在集合中按照鍵查詢一個元素時,一般只是用來確定這個元素是否存在,而在對映中按照鍵查詢一個元素時,除了能確定它的存在性外,還可以得到相應的附加資料。

例10-10

有五門課程,每門都有相應學分,從中選擇三門,輸出學分總和

//10_10.cpp
#include <iostream>
#include <map>
#include <string>
#include <utility>
using namespace std;
int main() {
    map<string, int> courses;
    //將課程資訊插入courses對映中
    courses.insert(make_pair("CSAPP", 3));
    courses.insert(make_pair("C++", 2));
    courses.insert(make_pair("CSARCH", 4));
    courses.insert(make_pair("COMPILER", 4));
    courses.insert(make_pair("OS", 5));
    int n = 3;      //剩下的可選次數
    int sum = 0;    //學分總和
    while (n > 0) {
        string name;
        cin >> name;    //輸入課程名稱
        map<string, int>::iterator iter = courses.find(name);//查詢課程
        if (iter == courses.end()) {    //判斷是否找到
            cout << name << " is not available" << endl;
        } else {
            sum += iter->second;    //累加學分
            courses.erase(iter);    //將剛選過的課程從對映中刪除
            n--;
        }
    }
    cout << "Total credit: " << sum << endl;    //輸出總學分
    return 0;
}
執行結果如下:
C++
COMPILER
C++
C++ is not available
CSAPP
Total credit: 9

例10-11

統計一句話中每個字母出現的次數

// 10_11.cpp
#include <iostream>
#include <map>
#include <cctype>
using namespace std;
int main() {
    map<char, int> s;   //用來儲存字母出現次數的對映
    char c;     //儲存輸入字元
    do {
      cin >> c; //輸入下一個字元
      if (isalpha(c)){ //判斷是否是字母
          c = tolower(c); //將字母轉換為小寫
          s[c]++;      //將該字母的出現頻率加1
      }
    } while (c != '.'); //碰到“.”則結束輸入
    //輸出每個字母出現次數
    for (map<char, int>::iterator iter = s.begin(); iter != s.end(); ++iter)
        cout << iter->first << " " << iter->second << "  ";
    cout << endl;
    return 0;
}