C++ STL map刪除鍵值對:erase()和clear()方法

2020-07-16 10:05:18
map 類別範本提供了 erase() 和 clear() 成員方法,可用來刪除容器中儲存的鍵值對。本節將對這 2 個成員方法做詳細的講解。

erase() 有 3 種適用於不同實際場景需要的語法格式,這也就意味著 erase() 有 3 種用法,分別如下。

1) 可以根據目標鍵值對位於 map 容器中的位置,實現刪除該鍵值對的目的。erase() 方法的語法格式如下:

//刪除 map 容器中指定位置的鍵值對
iterator erase (const_iterator position);

其中,position 為疊代器,指向要刪除的鍵值對。同時該方法會返回一個 iterator 疊代器,其指向的是刪除鍵值對之後的那個鍵值對。

注意,如果刪除的鍵值對位於 map 容器中最後的位置,則該方法返回的疊代器指向的是最後一個鍵值對之後的位置(等同於 end() 成員方法返回的疊代器)。

下面程式演示了 erase() 成員方法的用法:
#include <iostream>
#include <map>      // map
#include <string>   // string
using namespace std;

int main() {
    //建立並初始化 map 容器
    map<std::string, std::string>myMap{ {"C語言教學", "http://c.biancheng.net/c/"},
                                        {"Python教學", "http://c.biancheng.net/python/"},
                                        {"STL教學", "http://c.biancheng.net/stl/"} };
    //輸出myMap容器儲存鍵值對的個數
    cout <<"myMap size = " << myMap.size() << endl;
    //建立一個指向要刪除的鍵值對的疊代器
    map<string, string>::iterator iter = ++myMap.begin();
    //執行刪除操作
    map<string, string>::iterator ret = myMap.erase(iter);
    //輸出當前 myMap 容器中剩餘鍵值對的個數
    cout << "new myMap size = " << myMap.size() << endl;
    //輸出 erase() 方法返回的疊代器指向的鍵值對
    cout << ret->first << " " << ret->second << endl;
    return 0;
}
程式執行結果為:

myMap size = 3
new myMap size = 2
STL教學 http://c.biancheng.net/stl/

此程式中,要刪除的鍵值對是位於 myMap 容器中第 2 個位置的鍵值對,當使用 erase() 方法執行刪除操作之後,該方法返回的疊代器指向的是第 3 個鍵值對。

2) 除了向 erase() 傳入目標鍵值對位於 map 容器中的位置外,還可以傳入目標鍵值對的鍵的值,該方法會自行根據指定的鍵找到目標鍵值對,並將其刪除。erase() 方法的語法格式如下:

//刪除 map 容器中鍵為 k 的鍵值對
size_type erase (const key_type& k);

其中,引數 k 為要刪除鍵值對的鍵的值,該方法的返回值為成功刪除的鍵值對的個數。

舉個例子:
#include <iostream>
#include <map>      // map
#include <string>   // string
using namespace std;

int main() {
    //建立並初始化 map 容器
    map<std::string, std::string>myMap{ {"C語言教學", "http://c.biancheng.net/c/"},
                                        {"Python教學", "http://c.biancheng.net/python/"},
                                        {"STL教學", "http://c.biancheng.net/stl/"} };
    //輸出myMap容器儲存鍵值對的個數
    cout <<"myMap size = " << myMap.size() << endl;
    //刪除 myMap 容器鍵為 "Python教學" 的鍵值對
    int num = myMap.erase("Python教學");
    //輸出 myMap 容器中剩餘鍵值對的數量
    cout << "new myMap size = " << myMap.size() << endl;
    //輸出 erase() 方法的返回值
    cout << "num = " << num << endl;
    return 0;
}
程式執行結果為:

myMap size = 3
new myMap size = 2
num = 1

顯然,通過執行第 14 行程式碼,成功刪除了 myMap 容器中鍵為 "Python教學" 的鍵值對。值得一提的是,由於 map 容器中每個鍵值對的鍵都是獨一無二的,因此使用該語法格式的 erase() 方法,其返回值最大為 1。

3) 在某些實際場景中,可能需要刪除某個指定區域內的所有鍵值對,也可以通過 erase() 方法實現,其語法格式如下:

//刪除 map 容器中位於 [first,last) 區域內的所有鍵值對
iterator erase (const_iterator first, const_iterator last);

其中,引數 first 和 last 都是疊代器,它們的組合 [first, last) 就表示 map 容器中的某個範圍,該方法會刪除此範圍內的所有鍵值對,並返回一個疊代器,其指向刪除範圍之後的第一個鍵值對。

注意,如果 [fist,last) 範圍之後,不再有任何鍵值對,則 erase() 方法返回的疊代器將指向 map 容器最後一個鍵值對之後的位置(等同於 end() 成員方法返回的疊代器)。

舉個例子:
#include <iostream>
#include <map>      // map
#include <string>   // string
using namespace std;

int main() {
    //建立並初始化 map 容器
    map<std::string, std::string>myMap{ {"C語言教學", "http://c.biancheng.net/c/"},
                                        {"Python教學", "http://c.biancheng.net/python/"},
                                        {"STL教學", "http://c.biancheng.net/stl/"} };
    //輸出myMap容器儲存鍵值對的個數
    cout <<"myMap size = " << myMap.size() << endl;

    map<string, string>::iterator first = myMap.begin();
    map<string, string>::iterator last = --myMap.end();

    map<string, string>::iterator ret = myMap.erase(first,last);
   
    cout << "new myMap size = " << myMap.size() << endl;
    cout << ret->first << " " << ret->second << endl;
    return 0;
}
程式執行結果為:

myMap size = 3
new myMap size = 1
STL教學 http://c.biancheng.net/stl/

程式中,first 疊代器指向的是 myMap 容器中第一個鍵值對,last 疊代器指向的是 myMap 容器中最後一個鍵值對,通過呼叫 erase() 方法可以刪除 [first,last) 範圍內所有的鍵值對。

注意,[first,last) 為半閉半開區間,這意味著 erase() 方法會從 first 指向的鍵值對開始刪除(包括 first 指向的鍵值對),一直刪到 last 指向鍵值對的前面那個鍵值對。


另外,如果想刪除 map 容器中儲存的所有鍵值對,可以使用 clear() 成員方法。該方法的語法格式如下:

void clear()

可以看到,該方法不需要傳入任何引數,也不需要接收任何返回值。

下面程式演示了 clear() 的功能:
#include <iostream>
#include <map>      // map
#include <string>   // string
using namespace std;

int main() {
    //建立並初始化 map 容器
    map<std::string, std::string>myMap{ {"C語言教學", "http://c.biancheng.net/c/"},
                                        {"Python教學", "http://c.biancheng.net/python/"},
                                        {"STL教學", "http://c.biancheng.net/stl/"} };
    //輸出myMap容器儲存鍵值對的個數
    cout <<"myMap size = " << myMap.size() << endl;
    //清除 myMap 容器中所有的鍵值對
    myMap.clear();
    cout << "new myMap size = " << myMap.size() << endl;
    return 0;
}
程式執行結果為:

myMap size = 3
new myMap size = 0

從輸出結果中可以看到,未呼叫 clear() 方法之前,myMap 容器中存有 3 個鍵值對,而呼叫 clear() 方法後,myMap 容器就變成了空 map 容器。