一、插入數據
使用map類,數據的插入是非常簡單直接的事情。操作map的數據成員insert用於插入單個或序列元素到map中。對於同一個關鍵字可以重複插入,map的自動排序問題也會被自動排序。
// 以下代碼展示map的插入操作
#include <map>
#include <iostream>
using namespace std;
int main() {
map<string, double> dict;
// 插入單個元素
dict.insert(make_pair("apple", 1.2));
// 插入序列元素1
dict.insert(map<string, double>::value_type("banana", 0.8));
// 插入序列元素2
dict["orange"] = 0.7;
// 輸出所有元素
for (auto iter = dict.begin(); iter != dict.end(); ++iter) {
cout << iter->first << ": " << iter->second << endl;
}
return 0;
}
在上述代碼中,我們定義了一個名為dict的map,鍵為字元串類型,值為雙精度類型double。接下來我們使用insert方法插入數據,其中insert方法的參數需要是pair類型,表示鍵和值的對應關係。插入序列元素的方式有兩種:一種是使用map::value_type類型,另一種是直接使用[]操作符插入。最後通過遍歷map的所有元素,輸出它們的鍵和值。
二、重複插入元素
map中允許插入重複的鍵,因為map的特點就是使用自動排序的方式來存儲元素。在插入鍵值對時,如果插入的鍵已經存在於map中,那麼會自動覆蓋原有鍵所對應的值。
// 以下代碼展示map的插入和查找
#include <map>
#include <iostream>
using namespace std;
int main() {
map<string, double> dict;
dict.insert(make_pair("apple", 1.2));
dict.insert(make_pair("banana", 0.8));
// 針對同一個鍵進行多次賦值操作
dict["apple"] = 2.0;
dict["banana"] = 1.5;
// 輸出所有元素
for (auto iter = dict.begin(); iter != dict.end(); ++iter) {
cout << iter->first << ": " << iter->second << endl;
}
return 0;
}
在上述代碼中,我們先插入了兩個鍵值對,然後對同一個鍵進行多次賦值操作。最終輸出元素時,map依然只會輸出一份apple和banana,因為它們的鍵是重複的,後面的賦值操作會覆蓋前面的值。
三、插入性能測試
插入元素時,我們還需要考慮map插入的性能問題。因為map底層使用的紅黑樹來存儲元素,所以插入操作的時間複雜度是O(log n)。
我們可以通過使用chrono庫進行計時,來測試map插入的性能。
// 以下代碼展示map的性能測試
#include <map>
#include <iostream>
#include <chrono>
using namespace std;
int main() {
map<int, int> dict;
auto start = chrono::steady_clock::now();
for (int i = 0; i < 100000; ++i) {
dict[i] = i;
}
auto end = chrono::steady_clock::now();
auto duration = chrono::duration_cast<chrono::microseconds>(end - start);
cout << "map insert test duration: " << duration.count() << " microseconds" << endl;
return 0;
}
在上述代碼中,我們先定義了一個名為dict的map,鍵和值都是int類型的。然後通過計時來測試往map中插入100000個元素所需要的時間。
我們可以對比一下,如果使用vector來存儲元素,需要多長的時間:
// 以下代碼展示vector的性能測試
#include <vector>
#include <iostream>
#include <chrono>
using namespace std;
int main() {
vector<int> v;
auto start = chrono::steady_clock::now();
for (int i = 0; i < 100000; ++i) {
v.push_back(i);
}
auto end = chrono::steady_clock::now();
auto duration = chrono::duration_cast<chrono::microseconds>(end - start);
cout << "vector insert test duration: " << duration.count() << " microseconds" << endl;
return 0;
}
可以發現,插入100000個元素到map中,大概需要18微秒的時間,而插入到vector中只需要1微秒的時間。這是因為vector只需要考慮如何在數組末尾追加元素,沒有紅黑樹的重新平衡問題,所以比map插入效率更高。
四、總結
在c++中,使用map類進行元素的插入和查找是非常方便的,只需要調用insert等方法即可。由於map是使用紅黑樹實現的,所以插入元素的時間複雜度是O(log n),如果需要高效的插入和查找操作,可以考慮使用vector等更加高效的數據結構。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/198376.html