std::unordered_map::emplace_hint
#include <unordered_map>
template <class... Args>
iterator emplace_hint(const_iterator hint, Args&&... args);
Xây dựng (construct) một phần tử mới (cặp key-value
) trực tiếp trong std::unordered_map, tương tự như emplace()
, nhưng bạn có thể cung cấp thêm một gợi ý (hint) về vị trí chèn để có thể tối ưu hóa hiệu suất (nhưng không bắt buộc phải tối ưu).
Tham số
hint
- const_iterator trỏ đến vị trí gợi ý để chèn phần tử mới.
args
- Danh sách các đối số (có thể trống) được sử dụng để khởi tạo phần tử mới (cặp
key-value
). Các đối số này sẽ được truyền đến constructor củastd::pair<const Key, T>
.
Giá trị trả về
iterator
- Trả về một iterator trỏ đến phần tử vừa được chèn vào (nếu chèn thành công), hoặc iterator trỏ đến phần tử đã tồn tại có key tương đương (nếu chèn thất bại).
Đặc điểm
- Xây dựng phần tử tại chỗ (In-place construction): Giống như
emplace()
,emplace_hint()
tạo phần tử mới trực tiếp trong bộ nhớ của std::unordered_map, tránh việc tạo ra các đối tượng tạm thời không cần thiết. - Tránh sao chép và di chuyển: Bằng cách xây dựng phần tử tại chỗ,
emplace_hint()
giúp tránh việc sao chép (copy) hoặc di chuyển (move) các đối tượng. - Hỗ trợ variadic template:
emplace_hint()
sử dụng variadic template (Args&&... args), cho phép nó nhận số lượng đối số tùy ý, phù hợp với constructor của kiểustd::pair<const Key, T>
. - Gợi ý vị trí chèn (hint): Tham số
hint
cho phép bạn cung cấp gợi ý về vị trí chèn. Tuy nhiên, với std::unordered_map (không có thứ tự), gợi ý này thường không mang lại lợi ích đáng kể về hiệu suất so vớiemplace()
. - Có thể làm thay đổi iterator: Việc chèn phần tử vào std::unordered_map có thể làm thay đổi (invalidate) các iterator đang trỏ đến các phần tử trong std::unordered_map do rehash.
- Phân biệt với
emplace()
:emplace_hint()
tương tựemplace()
nhưng có thêm tham sốhint
để gợi ý vị trí chèn. Với std::unordered_map,hint
thường không mang lại hiệu quả rõ rệt. - Phân biệt với
insert()
:insert()
sẽ tạo bản sao hoặc di chuyển phần tử được truyền vào trong khi đóemplace_hint()
sẽ xây dựng phần tử tại chỗ trong std::unordered_map. - Có thể ném ngoại lệ: Nếu việc cấp phát bộ nhớ cho phần tử mới thất bại,
emplace_hint()
có thể ném ra ngoại lệ std::bad_alloc. Ngoài ra, nếu constructor củastd::pair<const Key, T>
ném ngoại lệ,emplace_hint()
cũng sẽ ném ngoại lệ. - Chèn phần tử duy nhất theo key: std::unordered_map chỉ lưu trữ các phần tử có key duy nhất. Nếu bạn cố gắng chèn một phần tử có key đã tồn tại,
emplace_hint()
sẽ không chèn thêm phần tử mới và iterator trả về sẽ trỏ đến phần tử đã tồn tại. - Độ phức tạp:
- Trung bình:
O(1)
- Trường hợp xấu nhất:
O(n)
, với n là số phần tử trong std::unordered_map.
- Trung bình:
Ví dụ
#include <iostream>
#include <unordered_map>
#include <string>
int main() {
std::unordered_map<std::string, int> myumap;
// Chèn các phần tử, sử dụng emplace_hint() với gợi ý
// Gợi ý trong trường hợp này không có nhiều ý nghĩa với unordered_map
// Nhưng với các container có thứ tự, vị trí gợi ý có thể giúp tối ưu
auto it = myumap.emplace_hint(myumap.end(), "banana", 2); // Gợi ý chèn vào cuối
it = myumap.emplace_hint(it, "apple", 1); // Gợi ý chèn vào trước "banana"
it = myumap.emplace_hint(myumap.end(), "orange", 3); // Gợi ý chèn vào cuối
std::cout << "mymap:\n";
for (const auto& p : myumap) {
std::cout << " (" << p.first << ", " << p.second << ")";
}
std::cout << '\n'; // Output: mymap: (orange, 3) (apple, 1) (banana, 2) (thứ tự có thể khác)
return 0;
}
Các hàm liên quan
emplace | Xây dựng (construct) một phần tử mới (cặp key-value ) trực tiếp trong std::unordered_map tại vị trí thích hợp |
insert | Chèn một phần tử mới (cặp key-value ) vào std::unordered_map |
[] | Truy cập phần tử có key tương ứng |
at | Truy cập phần tử có key cho trước |