Xóa phần tử trong unordered_map C++ | Laptrinhcanban.com

Xóa phần tử trong unordered_map C++

Hướng dẫn cách xóa unordered_map trong C++. Bạn sẽ học được cách sử dụng hàm unordered_map erase C++ để xóa phần tử trong unordered_map sau bài học này.

Để xóa phần tử trong unordered_map trong C++, chúng ta sử dụng tới hàm thành viên erase(). Do khi xóa phần tử trong unordered_map thì các phần tử còn lại sẽ được tự động sắp xếp, nên lưu ý khác với các containers khác như list hay vector thì trong unordered_map không tồn tại các hàm pop_front() hay pop_back() để xóa phần tử ở đầu hay cuối unordered_map.

Xóa 1 phần tử trong unordered_map bằng hàm erase c++

erase trong c++ là một hàm thành viên trong class std:unordered_map, có tác dụng xóa một hoặc nhiều phần tử trong unordered_map C++ cũng như làm giảm độ dài tương ứng của nó.

Để xóa 1 phần tử trong unordered_map c++ chúng ta sử dụng hàm erase với một trong 2 cú pháp sau đây:

mp.erase(itr);
OR
mp.erase(key);

Trong đó mp là unordered_map ban đầu, itrkey là trình lặp hoặc là khóa của phần tử cần xóa.

Nếu sử dụng erase(itr) thì hàm sẽ xóa đi phần tử tại vị trí mà trình lặp xác định bởi itr chỉ đến.

Và nếu sử dụng erase(key) thì hàm sẽ tìm phần tử có khóa bằng với key trong unordered_map và tiến hành xóa nó đi.

Ở đây trình lặp (iterator) là một vòng lặp có tác dụng giống như con trỏ, giúp truy cập đến các phần tử ở vị trí cụ thể trong unordered_map.

Khác với các container khác thì để chuyển trình lặp chỉ đến vị trí index thứ n trong unordered_map, chúng ta không thể đơn giản cộng vào n vào trình lặp, mà cần phải di chuyển lần lượt qua từng vị trí, bằng toán tử ++ với đủ số vòng lặp.

Ví dụ, trong trường hợp cần chỉ đến vị trí index thứ 5 trong unordered_map, chúng ta sẽ dùng hàm begin() trong C++ và viết trình lặp p như sau:

int n = 5;
auto itr = mp.begin(); //Tạo trình lặp trỏ đến vị trí đầu unordered_map
for (int i=1; i <= n; i++ )
++itr;

Hàm unordered_map erase sẽ trả về số lượng phần tử đã được xóa đi từ unordered_map ban đầu.

Lưu ý do phần tử trong unordered_map không được sắp xếp. Do đó chúng ta sẽ không quyết định được vị trí của các phần tử sau khi xóa đi phần tử từ unordered_map.

Ví dụ cụ thể:

#include <iostream>
#include <unordered_map>
using namespace std;

//Tạo hàm xuất unordered_map
void dump(unordered_map<char,int>& mp)
{
for (auto x: mp) {
cout << x.first << ":" << x.second << " ";
}
cout << endl;
}

int main ()
{
unordered_map<char,int> mp;

mp['a']=100;
mp['b']=200;
mp['c']=300;
mp['d']=400;
mp['e']=400;
dump(mp);

/*Tìm trình lặp trỏ đến phần tử có khóa bằng 'c' */
auto itr = mp.find('c'); // Chỉ đến c:300

//xóa phần tử tại vị trí itr chỉ đến
mp.erase(itr);
dump(mp);

//xóa phần tử có khóa bằng 'd' trong multimap
mp.erase('d');
dump(mp);

return 0;
}

Kết quả:

e:400 d:400 c:300 b:200 a:100 
e:400 d:400 b:200 a:100
e:400 b:200 a:100

Chúng ta cũng có thể kiểm tra số phần tử đã được xóa đi từ kết quả trả về của hàm như sau:

unordered_map<char,int> mp;

mp['x']=100;
mp['y']=200;
mp['z']=300;
mp['t']=400;

auto r = mp.erase('t'); /*r là số phần tử có key bằng 't' bị xóa*/
std::cout << r;
//1

Xóa các phần tử trong một phạm vi chỉ định bằng unordered_map erase c++

Chúng ta sử dụng unordered_map erase c++ để xóa các phần tử trong một phạm vi chỉ định của một unordered_map với cú pháp sau đây:

mp.erase( iterator_first, iterator_last);

Trong đó mp là unordered_map ban đầu, iterator_firstiterator_last là các trình lặp trỏ đến phạm vi bắt đầu và kết thúc xóa.

Lưu ý là phạm vi xóa là [iterator_first,iterator_last) sẽ được tính từ iterator_first đến trước iterator_last, nghĩa là phần tử ở vị trí iterator_first sẽ được xóa nhưng phần tử ở vị trí iterator_last sẽ không bị xóa đi.

Ứng dụng điều này, chúng ta có thể chỉ định trình lặp và xóa đi các phần tử trong phạm vi chỉ định từ unordered_map như sau:

#include <iostream>
#include <unordered_map>
using namespace std;

//Tạo hàm xuất unordered_map
void dump(unordered_map<char,int>& mp)
{
for (auto x: mp) {
cout << x.first << ":" << x.second << " ";
}
cout << endl;
}


int main ()
{
unordered_map<char,int> mp;

mp['a']=100;
mp['b']=200;
mp['c']=300;
mp['d']=400;
mp['e']=500;
mp['f']=600;

dump(mp);

/*Khai báo phạm vi cần xóa*/
int start = 2, end =5;

/*Tạo các trình lặp trỏ tới start và end với giá trị ban đầu*/
auto itr_start = mp.begin();
auto itr_end = mp.begin();

/*Thay đổi trình lặp tương ứng tới các vị trí start và end*/
for (int i=1; i <= start; i++ )
++itr_start;
for (int i=1; i <= end; i++ )
++itr_end;

//Sau đó dùng hàm erase để xóa phạm vi là xong
mp.erase(itr_start, itr_end);
dump(mp);

return 0;
}

Kết quả:

f:600 e:500 d:400 c:300 b:200 a:100 
f:600 e:500 a:100

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về cách xóa phần tử trong unordered_map C++ rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C++ trong các bài học tiếp theo.

Hãy chia sẻ và cùng lan tỏa kiến thức lập trình Nhật Bản tại Việt Nam!

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.