Thêm chèn phần tử vào unordered_map trong C++ | Laptrinhcanban.com

Thêm chèn phần tử vào unordered_map trong C++

Hướng dẫn cách thêm chèn phần tử vào unordered_map trong C++. Bạn sẽ học được cách dùng toán tử [] cũng hàm insert và hàm emplace để chèn thêm phần tử vào unordered_map trong C++ sau bài học này.

Để thêm chèn phần tử vào unordered_map trong C++, chúng ta sử dụng tới toán tử [] hoặc 2 hàm thành viên là insert() và emplace(). Do khi chèn phần tử vào unordered_map thì vị trí chèn sẽ được tự động quyết định tùy thuộc vào bộ sắp xếp trong unordered_map, 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 push_back() hay push_front() để thêm phần tử vào đầu hay cuối unordered_map.

Thêm 1 phần tử vào unordered_map trong C++ bằng toán tử []

Để thêm 1 phần tử vào unordered_map trong C++, chúng ta sử dụng toán tử [] với cú pháp sau đây:

mp[key] = value;

Trong đó

  • mp là tên biến unordered_map
  • keyvalue là khóa và giá trị của phần tử cần thêm vào unordered_map

Ví dụ:

unordered_map<char,int> foo,bar;

foo['x']=100; //()
foo['y']=200;

Lưu ý do mỗi key trong unordered_map đều là duy nhất nên nếu chúng ta thêm một phần tử mới vào unordered_map nhưng lại có key trùng với một phần tử đã tồn tại trước đó, thì giá trị của phần tử mới này sẽ được dùng để ghi đè lên phần tử trước đó.

Ví dụ:

#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> mymap;

mymap['x']=100;
mymap['y']=200;
mymap['z']=300;

dump(mymap); // z:300 y:200 x:100

mymap['z']=888;
dump(mymap); // z:888 y:200 x:100
}

Chèn 1 phần tử vào unordered_map trong C++ bằng hàm insert

Hàm insert là một hàm thành viên trong class std:unordered_map, có tác dụng chèn một hoặc nhiều phần tử vào unordered_map cũng như tăng độ dài tương ứng của nó.

Để chèn 1 phần tử vào trong unordered_map C++, chúng ta sử dụng hàm insert với cú pháp sau đây:

mp.insert(std::pair<k_type,x_type>(k,v));

Trong đó

  • mp là unordered_map ban đầu
  • pair<k_type,x_type>(k,v) sử dụng để chỉ định key và value của phần tử cần thêm, trong đó k_type,x_type là kiểu và k,v là key và value.

Trong trường hợp không rõ kiểu, hoặc muốn rút bỏ chỉ định kiểu của key và value, chúng ta có thể dùng hàm make_pair() để thay thế cho pair() trong hàm insert, với cú pháp sau đây:

mp.insert(std::make_pair(k,v));

Hàm unordered_map insert sẽ trả về một cặp kết quả pair<iterator, bool> với iterator là trình lặp trỏ đến unordered_map kết quả, và bool là việc có thực hiện việc chèn hay không, dưới dạng 0 hoặc 1.

Bởi vì các phần tử trong một unordered_map là duy nhất, nên thao tác chèn sẽ kiểm tra xem mỗi phần tử được chèn đã tồn tại trong unordered_map hay chưa. Nếu chưa tồn tại thì phần tử đó sẽ được chèn và ngược lại nếu đã tồn tại thì không được chèn.

Đây là điểm khác biệt so với cách dùng toán tử [], vì khi một key đã tồn tại trong unordered_map, nếu chúng ta dùng toán tử [] thì giá trị mới sẽ được ghi đè, còn nếu dùng hàm insert thì việc chèn sẽ thất bại.

Trong trường hợp tất cả các phần tử chèn vào vốn đã tồn tại từ trước trong unordered_map, thì bản thân unordered_map ban đầu sẽ được trả về.

Lại nữa, phần tử trong unordered_map được sắp xếp theo thứ tự cụ thể trước khi được lưu, nên các phần tử cần chèn thêm vào unordered_map sẽ được tự động quyết định vị trí dựa trên bộ sắp xếp, và chúng ta sẽ không quyết định được vị trí cần chèn của phần tử.

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 ()
{
/*Khai báo và gán giá trị cho foo và bar*/
unordered_map<char,int> mp;

mp['a']=100;
mp['b']=200;

// duyệt unordered_map ban đầu
dump(mp);

//chèn phần tử với key chưa tồn tại trong unordered_map
mp.insert(pair<char,int>('c',300));
dump(mp);

//chèn phần tử với key đã tồn tại trong unordered_map
mp.insert(pair<char,int>('a',3));
dump(mp);

//chèn phần tử bằng insert và make_pair
mp.insert(make_pair('x',50));
dump(mp);

return 0;
}

Kết quả:

b:200 a:100 
c:300 b:200 a:100
c:300 b:200 a:100 // Do key đã tồn tại nên sẽ không được chèn
x:50 c:300 b:200 a:100

Chúng ta cũng có thể kiểm tra việc chèn phần tử đã thực hiện hay chưa bằng phương thức first() hoặc second() từ kết quả trả về của hàm như sau:

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

int main ()
{
/*Khai báo và gán giá trị cho foo và bar*/
unordered_map<char,int> mp;

mp['a']=100;
mp['b']=200;

//chèn phần tử với key chưa tồn tại trong unordered_map
auto r = mp.insert(pair<char,int>('z',300));
cout << r.second << "\n"; // Trả về 1 do được chèn

//chèn phần tử với key tồn tại trong unordered_map,
r = mp.insert(pair<char,int>('a',3));
cout << r.second << "\n"; // Trả về 0 do không được chèn

return 0;
}

Thêm chèn 1 phần tử vào unordered_map trong C++ bằng hàm emplace

Hàm emplace là một hàm thành viên trong class std:unordered_map, có tác dụng chèn một hoặc nhiều phần tử vào unordered_map thông qua hàm tạo của kiểu dữ liệu, cũng như tăng độ dài tương ứng của unordered_map.

Để chèn thêm 1 phần tử vào trong unordered_map C++, chúng ta sử dụng hàm emplace với cú pháp sau đây:

mp.emplace(k,v);

Trong đó

  • mp là unordered_map ban đầu
  • k,v là key và value.

Hàm unordered_map emplace sẽ thực hiện việc chèn phần tử nếu key của nó chưa tồn tại trong unordered_map. Ngược lại nếu key đó đã tòn tại, việc chèn thất bại và false sẽ được trả về.

Và Hàm unordered_map emplace sẽ trả về một trình lặp trỏ tới vị trí phần tử vừa được chèn vào, nếu việc chèn thành công.

Lại nữa, phần tử trong unordered_map được lưu vào dựa theo giá trị hash của các khóa, nên các phần tử cần chèn thêm vào unordered_map sẽ được tự động quyết định vị trí dựa trên giá trị hash ở trên bảng hash, và chúng ta sẽ không quyết định được vị trí cần chèn của phần tử.

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 ()
{
std::unordered_map<char,int> mymap;

mymap.emplace('x',100);
mymap.emplace('y',200);
mymap.emplace('z',100);

dump(mymap);
return 0;
}

Kết quả:

z:100 y:200 x:100 

Chèn nhiều phần tử vào unordered_map trong C++ bằng hàm insert

Để chèn nhiều phần tử vào trong unordered_map C++, chúng ta sử dụng hàm insert với cú pháp sau đây:

mp.insert(iterator_first, iterator_last);

Trong đó

  • mp là unordered_map ban đầu
  • iterator_firstiterator_last là các trình lặp xác định phạm vi chứa các phần tử cần chèn ở trong một unordered_map khác vào unordered_map ban đầu.

Lưu ý ở đây, các phần tử cần chèn được lấy ra từ một phạm vi trong một unordered_map khác, và phạm vi này được chỉ định thông qua 2 trình lặp như trên.

Ví dụ cụ thể:

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

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


int main ()
{
/* Khởi tạo unordered_map mp1*/
unordered_map<int, const char*> mp1 =
{
{1, "a"},
{2, "b"},
{3, "c"},
{4, "d"},
{5, "e"},
};
// duyệt unordered_map mp1
dump(mp1);

/*Khai báo unordered_map mp2*/
unordered_map<int, const char*> mp2;

/*Chèn các phần tử từ đầu tới phần tử có key bằng 2
từ mp1 vào mp2*/
mp2.insert(mp1.begin(),mp1.find(2));


// duyệt unordered_map mp2
dump(mp2);
return 0;
}

Và kết quả:

5: e 4: d 3: c 2: b 1: a 
3: c 4: d 5: e

Tổng kết

Trên đây Kiyoshi đã hướng dẫn bạn về cách thêm chèn chèn phần tử vào unordered_map trong 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.