STL map 常見用法詳解


《算法筆記》學習筆記

map 常見用法詳解

**map翻譯為映射,也是常用的STL容器 **
map可以將任何基本類型(包括STL容器)映射到任何基本類型(包括STL容器)

1. map 的定義

//單獨定義一個map
map<typename1, typename2> mp;
//map和其他的STL容器在定義上有點不同
//因為 map 需要確定映射前類型(鍵key)和映射后類型(值value)
//其中第一個是鍵的類型,第二個是值的類型

//字符串到整型的映射
//必須使用string而不能用char數組
map<string, int> mp;

//map的鍵和值也可以是STL容器
//將一個 set 容器映射到一個字符串
map<set<int>, string> mp;

2. map 容器內元素訪問

//map 一般有兩種訪問方式:通過下標或迭代器訪問

(1) 通過下標訪問

//和訪問普通的數組是一樣的
//注意:map中的鍵是唯一的
#include <stdio.h>
#include <map>
using namespace std;
int main() {
    map<char, int> mp;
    mp['c'] = 20;
    mp['c'] = 30;   //20被覆蓋
    printf("%d\n", mp['c']);
    return 0;
}

(2) 通過迭代器訪問

//map 迭代器的定義和其他STL容器迭代器定義的方式相同
map<typename1, typename2>::iterator it;
//typename1和typename2就是定義map填寫時的類型
//map的每一對映射都有兩個typename,這決定了必須能通過一個 it 來同時訪問鍵和值。
//map 可以使用 it->first 來訪問鍵, it->second 來訪問值。
#include <stdio.h>
#include <map>
using namespace std;
int main() {
	map<char, int> mp;
	mp['m'] = 20;
	mp['r'] = 30;
	mp['a'] = 40;
	for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
        printf("%c %d\n", it -> first, it -> second);
    }
    return 0;
}

3. map常用函數實例解析

**(1) find() **

//find(key)返回鍵為key的映射的迭代器,時間復雜度為O(logN),N為map中映射的個數
#include <stdio.h>
#include <map>
using namespace std;
int main() {
    map<char, int> mp;
    mp['a'] = 1;
    mp['b'] = 2;
    mp['c'] = 3;
    map<char, int>::iterator it = mp.find('b');
    printf("%c %d\n", it -> first, it -> second);
    return 0;
}

(2) erase()

//erase()有兩種用法:刪除單個元素,刪除一個區間內的所有元素
//<1> 刪除單個元素
//刪除單個元素有兩種方法:
//mp.erase(it), it為需要刪除的元素的迭代器,時間復雜度為O(1)
#include <stdio.h>
#include <map>
using namespace std;
int main() {
    map<char, int> mp;
    mp['a'] = 1;
    mp['b'] = 2;
    mp['c'] = 3;
    map<char, int>::iterator it = mp.find('b');
    mp.erase(it);   //刪除 b 2
    for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
        printf("%c %d\n", it -> first, it -> second);
    }
    return 0;
}

//mp.erase(key), key為欲刪除的映射的鍵。時間復雜度為O(logN),N為map內元素的個數
#include <stdio.h>
#include <map>
using namespace std;
int main() {
    map<char, int> mp;
    mp['a'] = 1;
    mp['b'] = 2;
    mp['c'] = 3;
    mp.erase('b');  //刪除鍵為b的映射,即 b 2
    for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
        printf("%c %d\n", it -> first, it -> second);
    }
    return 0;
}

//<2> 刪除一個區間內的所有元素
//mp.erase(first, last), 其中first為需要刪除的區間的起始迭代器,
//而last則為需要刪除的區間的末尾迭代器的下一個地址,也即為刪除左閉右開
//的區間[first, last)。時間復雜度為O(last - first)
#include <stdio.h>
#include <map>
using namespace std;
int main() {
    map<char, int> mp;
    mp['a'] = 1;
    mp['b'] = 2;
    mp['c'] = 3;
    mp<char, int>::iterator it = mp.find('b');  //令it指向鍵為b的映射
    mp.erase(it. mp.end()); //刪除it之后的所有映射,即b 2和c 3
    for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++) {
        printf("%c %d\n", it -> first, it -> second);
    }
    return 0;
}

(3) size()

//size()用來獲取map中映射的對數,時間復雜度位O(1)
#include <stdio.h>
#include <map>
using namespace std;
int main() {
    map<char, int> mp;
    mp['a'] = 10;
    mp['b'] = 20;
    mp['c'] = 30;
    printf("%d\n", mp.size());  //3對映射
    return 0;
}

(4) clear()

//clear()用來清空map中的所有元素,復雜度為O(N),其中N為map中元素的個數。
#include <stdio.h>
#include <map>
using namespace std;
int main() {
    map<char, int> mp;
    mp['a'] = 1;
    mp['b'] = 2;
    mp['c'] = 3;
    mp.clear();     //清空map
    printf("%d\n", mp.size());
    return 0;
}

4.map的常見用途

  • 需要建立字符(或字符串)與整數之間映射的題目,使用map可以減少代碼量。
  • 判斷大整數或者其他類型數據是否存在的題目,可以把map當作bool數組用。
  • 字符串和字符串的映射也有可能會遇到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM