Bài 11: Map - Khái niệm cơ bản - Sử dụng thư viện chuẩn STL cho C/C++

Đăng bởi: Admin | Lượt xem: 16012 | Chuyên mục: C/C++


Định nghĩa về Map : 

Các lớp vector, list thuộc cấu trúc Sequence Containers (cấu trúc tuần tự), riêng với lớp map thuộc một cấu trúc khác đó là Associative Containers (cấu trúc liên kết), là kiểu dữ liệu cho phép quản lý một cặp key/value - khóa và giá trị, nghĩa là muốn xác định được nội dung value thì phải biết được vị trí key mà map đang quản lý.  
Có lẽ trước khi biết đến map trong C++, bạn đã sử dụng qua rất nhiều các cấu trúc dữ liệu quen thuộc khác như cấu trúc mảng (array), danh sách liên kết (linked list), cấu trúc stack, queue, ..v.v. thì map cũng là một cấu trúc dữ liệu tương tự nằm trong thư viện chuẩn std của C++.
Map cũng chính như cái tên của nó, giúp bạn mường tượng được rằng nó là một tập hợp của nhiều phần tử như cấu trúc mảng, nhưng mỗi phần tử trong nó không đơn thuần chỉ là một số hoặc một giá trị cụ thể nào đó (như trong cấu trúc mảng), mà mỗi phần tử chính là một cặp bao gồm giá trị bắt đầu gọi là key (tạm dịch là chìa khóa) và giá trị đích value (tạm dịch là giá trị ẩn), chúng ta cần giá trị bắt đầu để dẫn đường tới thứ ẩn đằng sau nó.
Lấy cuốn từ điển làm ví dụ, chúng ta có một từ không hiểu, gọi từ đó là key, dùng từ đó để tra trong từ điển, nó sẽ dẫn tới một đoạn văn giải thích nào đó, thì đoạn văn đó gọi là value. Ví dụ, "nước": "một loại chất lỏng không mùi không vị".
Trong lập trình, khi bạn muốn dùng một định danh nào đó thay thế cho giá trị ẩn thật sự đằng sau nó, ví dụ dùng từ "một" để thay thế cho số "1", thì bạn nên nghĩ ngay tới việc sử dụng cấu trúc map.
Một điểm đặc biệt nữa là mỗi key trong map là duy nhất và không thể bị trùng lắp, trong khi giá trị ẩn của key đó thì có thể bị trùng lắp với giá trị ẩn của key khác, đây cũng là điều dễ hiểu bởi vì nếu chúng ta có hai điểm bắt đầu, chúng ta sẽ phân vân không biết chọn điểm bắt đầu nào, đó là một trong những tính chất quan trọng của map.
Nếu bạn muốn lưu danh sách các phần tử không bị trùng lắp hoặc đếm số lần xuất hiện của mỗi từ trong câu thì sao, map là sự lựa chọn hoàn hảo.

Cách sử dụng Map trong stl :

Bạn có thể tìm thấy cấu trúc map trong thư viện <map> của C++.
Sử dụng khá đơn giản, khai báo một cấu trúc map như sau:
map<kiểu dữ liệu của key, kiểu dữ liệu của value> someMap;
Trong đó kiểu dữ liệu của key thường là string, kiểu dữ liệu của value thường là giá trị số như int, float, ..v.v. someMap là tên bạn muốn đặt cho map.
Ví dụ:
#include <iostream>
#include <map>
using namespace std;

int main() {
    map<string, int> A; // Khởi tạo một map A

    // Thêm vào map A một số phần tử.
    A["One"] = 1;
    A["Two"] = 2;
    A["Three"] = 3;

    // Duyệt và xuất ra từng cặp giá trị key: value của mỗi phần tử trong map A
    map<string, int>::iterator it;
    for (it = A.begin(); it != A.end(); it++) {
        cout << it->first.c_str() << ": " << it->second << endl;
    }

    // Thêm vào một phần tử giá trị key trùng lặp, chuyện gì sẽ xảy ra?
    A["One"] = 10;

    // In kết quả map A ra màn hình sau khi thêm vào 1 key trùng lặp,
    // tự chạy code xem kết quả của chính bạn.
    for (it = A.begin(); it != A.end(); it++) {
        cout << it->first.c_str() << ": " << it->second << endl;
    }
}

Thành phần Map :

Nếu như lớp map quản lý cặp đối tượng key/value, vậy đối tượng nào sinh ra được cặp đối tượng đó. Để sinh ra cặp đối tượng key/value cần sử dụng lớp pair, lớp pair nằm trong thư viện utility. Trước khi tìm hiểu về lớp map cần biết về lớp pair.
1. Lớp pair :
pair cho phép gộp 2 đối tượng thành một cặp, 2 đối tượng có thẻ cùng kiểu hoặc khác kiểu, với thuộc tính first là key và second là value.
Cú pháp khai báo: pair<valueType1, valueType2> variableName;
ví dụ :
pair<string, string> dictionary;
pair có các constructor như:
  • default constructor
  • copy constructor
  • initialization constructor
Ví dụ:
// default constructor
pair<int, char*> defaultPair;

// initialization constructor
pair<int, char*> initPair(0, "a");

// copy constructor
pair<int, char*> copyPair(pair1);
Lớp pair có các thuộc tính first second cho phép lấy dữ liệu :
pair<string, string> word("eat", "an");
cout << word.first << " " << word.second;
2 . Lớp map :
Lớp map nằm trong thư viện map vì vậy muốn sử dụng trước tiên phải #include <map>.
Cú pháp khai báo: map<valueType1, valueType2> variableName;
Ví dụ:
map<string, string> dictionary;
dictionary["eat"] = "an";
dictionary["sleep"] = "ngu";
Biến dictionary được khai báo với cặp dữ liệu là <string, string>, vì vậy:
  • key của dictionary phải là kiểu string - "eat" "sleep"...
  • value của dictionary phải là kiểu string - "an" "ngu"...
Lớp map cũng giống như những lớp vector, list đều được định nghĩa các hàm thành viên hỗ trợ cho việc truy xuất, lấy kích thước, các constructor đã được override, …
Bài tiếp theo: Map - Bài tập cơ bản >>
vncoder logo

Theo dõi VnCoder trên Facebook, để cập nhật những bài viết, tin tức và khoá học mới nhất!