std::unordered_multiset::insert
#include <unordered_set>
// Phiên bản 1: Chèn một phần tử (C++98 và C++11)
iterator insert(const value_type& val);
iterator insert(value_type&& val); // (since C++11)
// Phiên bản 2: Chèn với gợi ý vị trí (C++98 và C++11)
iterator insert(const_iterator hint, const value_type& val);
iterator insert(const_iterator hint, value_type&& val); // (since C++11)
// Phiên bản 3: Chèn các phần tử từ một phạm vi khác (C++98 và C++11)
template <class InputIterator>
void insert(InputIterator first, InputIterator last);
// Phiên bản 4: Chèn các phần tử từ initializer list (C++11)
void insert(initializer_list<value_type> ilist);
Chèn một hoặc nhiều phần tử mới vào std::unordered_multiset. Vì std::unordered_multiset cho phép lưu trữ các giá trị trùng lặp, insert()
sẽ luôn chèn phần tử mới vào std::unordered_multiset, ngay cả khi phần tử đó đã tồn tại.
Tham số
val
- Giá trị của phần tử cần chèn (phiên bản 1 và 2).
hint
- Iterator gợi ý vị trí chèn (phiên bản 2).
first, last
- Iterator xác định phạm vi các phần tử cần chèn (phiên bản 3).
ilist
- initializer_list chứa các phần tử cần chèn (phiên bản 4).
Giá trị trả về
- Phiên bản 1:
- Trả về iterator trỏ đến phần tử vừa được chèn vào trong std::unordered_multiset.
- Phiên bản 2:
- Trả về iterator trỏ đến phần tử vừa được chèn vào trong std::unordered_multiset.
- Phiên bản 3 và 4:
void
: Không trả về giá trị nào.
Đặc điểm
- Chèn phần tử, cho phép trùng lặp: std::unordered_multiset cho phép lưu trữ các phần tử trùng lặp, do đó
insert()
luôn chèn phần tử mới vào std::unordered_multiset, ngay cả khi phần tử đó đã tồn tại. - Không đảm bảo thứ tự: std::unordered_multiset không lưu trữ phần tử theo thứ tự, vì vậy vị trí chèn không ảnh hưởng đến thứ tự duyệt.
- Hỗ trợ gợi ý vị trí: Phiên bản
insert(hint, val)
cho phép bạn cung cấp gợi ý vị trí chèn, có thể giúp cải thiện hiệu suất nếu bạn biết vị trí chèn gần đúng (ít dùng với std::unordered_multiset). - Hỗ trợ move semantics: Phiên bản
insert(const_iterator pos, value_type&& val)
(từ C++11) hỗ trợ di chuyển (move semantics), giúp tối ưu hiệu suất khi chèn các đối tượng lớn hoặc phức tạp. - Có thể làm thay đổi iterator: Việc chèn phần tử vào std::unordered_multiset có thể làm thay đổi (invalidate) các iterator đang trỏ đến các phần tử trong std::unordered_multiset do việc
rehash()
có thể xảy ra. - 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,
insert()
có thể ném ra ngoại lệ std::bad_alloc. Ngoài ra, nếu copy constructor (phiên bản 1) hoặc move constructor (phiên bản 2) củavalue_type
ném ngoại lệ,insert()
cũng sẽ ném ngoại lệ. - Độ phức tạp:
- Chèn một phần tử: Trung bình
O(1)
, trường hợp xấu nhấtO(n)
, với n là số phần tử trong std::unordered_multiset. - Chèn nhiều phần tử (phiên bản 3 và 4): Trung bình
O(k)
, trường hợp xấu nhấtO(k*n)
, với k là số phần tử được chèn và n là số phần tử trong std::unordered_multiset.
- Chèn một phần tử: Trung bình
Ví dụ
#include <iostream>
#include <unordered_set>
#include <string>
#include <vector>
int main() {
std::unordered_multiset<std::string> myumset;
// Phiên bản 1: Chèn từng phần tử
myumset.insert("apple");
myumset.insert("banana");
myumset.insert("orange");
myumset.insert("apple"); // Chèn trùng lặp
std::cout << "myumset after inserting elements:";
for (const auto& str : myumset) std::cout << ' ' << str;
// Output: myumset after inserting elements: orange apple apple banana (thứ tự có thể khác)
std::cout << '\n';
// Phiên bản 2: Chèn với gợi ý vị trí (ít ý nghĩa với unordered_multiset)
auto it = myumset.find("banana");
myumset.insert(it, "grape");
// Phiên bản 3: Chèn từ một range
std::vector<std::string> vec = {"kiwi", "mango", "apple"};
myumset.insert(vec.begin(), vec.end());
// Phiên bản 4: Chèn từ initializer list
myumset.insert({"pear", "avocado", "banana"});
std::cout << "myumset after more insertions:";
for (const auto& str : myumset) std::cout << ' ' << str;
// Output: myumset after more insertions: avocado pear mango kiwi grape orange banana apple apple apple (thứ tự có thể khác)
std::cout << '\n';
return 0;
}
Các hàm liên quan
emplace | Xây dựng (construct) một phần tử mới trực tiếp trong std::unordered_multiset |
emplace_hint | Xây dựng (construct) một phần tử mới trực tiếp trong std::unordered_multiset với một gợi ý (hint) |
= | Gán nội dung của một std::unordered_multiset khác hoặc một initializer_list cho std::unordered_multiset hiện tại |
erase | Xóa một hoặc nhiều phần tử khỏi std::unordered_multiset |