在 C++ 中的 STL 對映中插入新元素
-
使用
insert
成員函式在 C++ 中向std::map
新增新元素 -
使用
insert_or_assign
成員函式在 C++ 中向std::map
新增新元素 -
使用
emplace
成員函式在 C++ 中向std::map
新增新元素 -
使用
emplace_hint
成員函式在 C++ 中向std::map
新增新元素
本文將解釋如何在 C++ 中的 std::map
物件中新增新元素的多種方法。
使用 insert
成員函式在 C++ 中向 std::map
新增新元素
STL map
容器提供了一種資料結構,用於將鍵值對儲存為元素,在插入或初始化時自動排序。可以使用多種方法將新元素新增到 std::map
物件,其中最常見的是 insert
函式。
insert
成員函式有多個過載。儘管如此,最簡單的方法只需要一個引數來指定對插入物件的 const
引用。另一個過載可以接受 r 值引用並使用 std::forward
命令就地構造元素,如以下示例程式碼所示。
後一個過載返回一對插入元素的迭代器和 bool
值,表明插入成功。我們還演示了 insert
函式的過載,它採用類似於初始化列表的鍵值列表,並從值構造元素。但是,此過載沒有返回型別。
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.insert({"k", "ktop"});
ret.second ? cout << "Inserted" : cout << "Not Inserted";
cout << "\n";
m1.insert({{"k", "ktop"}, {"p", "ptop"}});
printMap(m1);
return EXIT_SUCCESS;
}
輸出:
Not Inserted
h : htop;
k : ktop;
p : ptop;
使用 insert_or_assign
成員函式在 C++ 中向 std::map
新增新元素
較新的 C++17 標準提供了一個名為 insert_or_assign
的成員函式,如果給定的鍵不存在,它會在對映中插入一個新元素。否則,該函式會將新值分配給具有現有鍵的元素。
該函式有多個過載,但以下示例中呼叫的過載將兩個引數作為對鍵和值的 r 值引用。此過載還返回一對迭代器和一個 bool
值。請注意,我們使用條件運算子檢查插入的狀態並列印相應的訊息。
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.insert_or_assign("p", "ptop");
ret.second ? cout << "Inserted" : cout << "Assigned";
cout << "\n";
ret = m1.insert_or_assign("t", "ttop");
ret.second ? cout << "Inserted" : cout << "Assigned";
cout << "\n";
printMap(m1);
return EXIT_SUCCESS;
}
輸出:
Inserted
Inserted
h : htop;
k : ktop;
p : ptop;
t : ttop;
使用 emplace
成員函式在 C++ 中向 std::map
新增新元素
std::map
容器提供的另一個成員函式是 emplace
。與 insert
函式相比,此函式提供了效率,因為它不需要複製引數值。相反,emplace
函式將就地構造元素,這意味著給定的引數被轉發到類建構函式。請注意,根據引數,將呼叫相應的建構函式。
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.emplace("t", "ttop");
ret.second ? cout << "Inserted" : cout << "Not Inserted";
cout << endl;
ret = m1.emplace(std::make_pair("t", "ttop"));
ret.second ? cout << "Inserted" : cout << "Not Inserted";
cout << endl;
printMap(m1);
return EXIT_SUCCESS;
}
輸出:
Inserted
Not Inserted
h : htop;
k : ktop;
t : ttop;
使用 emplace_hint
成員函式在 C++ 中向 std::map
新增新元素
或者,可以使用 emplace_hint
成員函式將一個新元素插入到 Map 中,並帶有一個名為 hint
的附加引數,該引數指定操作應開始搜尋的位置。如果該過程成功,它將向新插入的元素返回一個迭代器。否則,返回具有相同鍵的現有元素的迭代器。
#include <iostream>
#include <map>
using std::cout;
using std::endl;
using std::map;
using std::string;
template <typename Map>
void printMap(Map& m) {
for (auto& p : m) cout << p.first << " : " << p.second << ";" << endl;
cout << endl;
}
int main() {
std::map<string, string> m1 = {
{"h", "htop"},
{"k", "ktop"},
};
auto ret = m1.emplace_hint(m1.begin(), "t", "ttop");
m1.emplace_hint(ret, "m", "mtop");
m1.emplace_hint(m1.begin(), "p", "ptop");
printMap(m1);
return EXIT_SUCCESS;
}
輸出:
h : htop;
k : ktop;
m : mtop;
p : ptop;
t : ttop;