STDIO
Tìm kiếm gần đây
    • Nội dung
    • QR Code
    • 0
    • 0
    • Sao chép

    STL - Map Trong C++

    Sử dụng STL Map trong C++, tìm hiểu, các phương thức thường được dùng trong map.
    21/09/2014
    08/09/2020
    5 phút đọc
    STL - Map Trong C++

    Map là gì?

    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 1 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ý 1 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í keymap đang quản lý.

    Nội dung

    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.

    [A] Lớp pair

    pair cho phép gộp 2 đối tượng thành 1 cặp, 2 đối tượng có thẻ cùng kiểu hoặc khác kiểu, với thuộc tính firstkeysecondvalue.

    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 firstsecond cho phép lấy dữ liệu

    pair<string, string> word("eat", "an");
    cout << word.first << " " << word.second;

    [B] 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, …

    Các phương thức thường dùng trong map

    Constructor

    Cũng giống với những lớp vector, list đều có:

    • default constructor
    • ranger constructor
    • copy constructor.

    Các hàm thành viên này hoạt động hoàn toàn giống với lớp vector, list.

    Ví dụ:

    // default constructor
    map<char, int> character0;
    
    character0['a'] = 97;
    character0['b'] = 98;
    character0['c'] = 99;
    character0['d'] = 100;
    
    // range constructor
    map<char, int> character1(character0.begin(), character0.end());
    
    // copy constructor
    map<char, int> character2(character1);

    Ngoài ra còn có operator= cho phép các lớp map có thể sao chép nội dung cấu trúc dữ liệu với nhau.

    map<int, char*> map0, map1;
    map0[0] = "a";
    map0[1] = "b";
    
    map1 = map0;

    Duyệt map

    Lớp map quản lý value bằng key, nếu trường hợp quên map thì làm sao có thể truy xuất để lấy dữ liệu value. Để giải quyết vấn đề trên trong lớp map định nghĩa thao tác iterators cho phép truy xuất đến phần tử trong map để lấy dữ liệu valuekey cần thiết. Có các iterators đã được cung cấp như: begin(), end(), rbegin(), rend(), ... chúng hoạt động như nhau nhưng chỉ khác phần tử truy cập ở vị trí nào trong lớp map.

    Ví dụ:

    map<int, char*> texes;
    texts[0] = "ab";
    texts[1] = "bc";
    texts[0] = "cd";
    
    map<int, char*>::iterator i;
    
    for (i = texts.begin(); i != texts.end(); i++)
    	cout << *i << endl;
    // output (0, "cd"), (1, "bc")

    Kết quả tại sao không phải là: (0, "ab") (1, "bc")  hay (0, "ab") (1, "bc") (0, "cd"), ... đó là do trong lớp map quy định key chỉ được tồn tại duy nhất (không được trùng), vì vậy khi khai báo ở dòng texts[0] = "cd"; sẽ làm thay đổi dữ liệu của texts[0] từ "ab" thành "cd".

    Lấy kích thước của map

    size() cho phép lấy kích thước của map.

    Ví dụ:

    map<int, char*> mymap, copymymap;
    mymap[0] = "a";
    mymap[1] = "b";
    mymap[0] = "c";
    
    cout << mymap.size();

    Kiểm tra map có rỗng hay không?

    empty() cho phép kiểm tra map có rỗng hay không?

    Ví dụ:

    map<int, char*> mymap, copymymap;
    mymap[0] = "a";
    mymap[1] = "b";
    mymap[0] = "c";
    
    if (copymymap.empty()) cout << "copymymap is empty";

    Truy xuất theo chỉ số

    [index] hay at(index) cho phép truy xuất trực tiếp đến key của từng phần tử.

    map<int, char*> mymap, copymymap;
    mymap[0] = "a";
    mymap[1] = "b";
    
    cout << mymap[1] << " " << mymap.at(0);

    Thêm dữ liệu vào map

    insert() cho phép chèn thêm 1 đối tượng.

    Ví dụ:

    map<int, char*> mymap, copymymap;
    mymap[0] = "a";
    mymap[1] = "b";
    mymap[5] = "c";
    
    // chèn vào copymymap cặp đối tượng (10, "c")	
    copymymap.insert(pair<int, char*>(10, "c"));
    // chèn (-1, "d") vào copymymap từ vị trí bắt đầu của copymymap copymymap.insert(copymymap.begin(), pair<int, char*>(-1, "d"));
    // chèn mymap vào copymymap copymymap.insert(mymap.begin(), mymap.end());
    // => copymymap = {(-1,"d"),(0,"a"),(1,"b"),(5,"c"),(10,"c")}

    Lưu ý việc chèn ở vị trí nào thật ra là vô nghĩa, vì vị trí của nó phụ thuộc vào key trong cặp đối tượng "key/ value", trong ví dụ trên thì "key" là kiểu số nguyên vì vậy vị trí của các cặp đối tượng key/value sẽ được xác định theo các key sắp xếp tăng dần.

    Tìm kiếm phần tử

    find() cho phép tìm kiếm theo key của cặp giá trị key/value

    Ví dụ:

    map<int, char*> mymap;
    mymap[0] = "a";
    mymap[1] = "b";
    mymap[5] = "c";
    mymap[9] = "e";
    map<int, char*>::iterator var = mymap.find(5);
    // var -> (5,"c")

    Xóa bỏ 1 phần tử trong map

    erase() cho phép xóa 1 phần tử.

    Ví dụ:

    map<int, char*> mymap, copymymap;
    mymap[0] = "a";
    mymap[1] = "b";
    mymap[5] = "c";
    mymap[7] = "d";
    mymap[9] = "e";
    
    // xóa cặp đối tượng với "key" là 5
    mymap.erase(5);		
    // => mymap =  {(0,"a"),(1,"b"),(7,"d"),(9,"e")}
    	
    map<int, char*>::iterator var = mymap.begin();
    // xóa cặp đối tượng mà var đang truy cập
    mymap.erase(var); // => mymap =  {(1,"b"),(7,"d"),(9,"e")}
    
    var = mymap.find(7); // => var truy cập đến (7,"d")
    
    // xóa từ vị trí var đang truy cập cho đến (9,"e") 
    mymap.erase(var, mymap.end()); // => mymap = {(1,"b")}

    Xóa tất cả phần tử trong map

    clear() cho phép xóa tất cả phần tử.

    Ví dụ:

    map<int, char*> mymap;
    mymap[0] = "a";
    mymap[1] = "b";
    mymap[5] = "c";
    mymap[7] = "d";
    mymap[9] = "e";
    
    mymap.clear();		
    // => mymap =  {}

    Hoán đổi nội dung 2 map

    swap() cho phép hoán đổi nội dung của 2 map.

    Ví dụ:

    map<char,int> map1, map2;
    
    map1['x'] = 100;
    map1['y'] = 200;
    
    map2['a'] = 11;
    map2['b'] = 22;
    map2['c'] = 33;
    
    map1.swap(map2);
    // => map1 = {("x",11),("b",22),("c",33)}
    // => map2 = {("x",100),("y",200)}
     
    0 Bình luận
    Modern C++

    Modern C++

    STDIO Training - Đào Tạo Lập Trình C++.

    Đề xuất

    STL - Vector Trong C++
    Hướng dẫn sử dụng STL vector container trong C++, các phương thức duyệt, ...
    9 Tính Năng Quan Trọng Trong C++11
    C++11 là một phiên bản cải tiến và nâng cấp từ C++98 (hay các bạn vẫn ...
    13/08/2015

    Khám phá

    STL - List Trong C++
    Tìm hiểu về STL, viết tắt của cụm từ Standard Template Library, bộ thư ...
    Một Số Hàm Hữu Ích trong Thư Viện Algorithm C++ (STL)
    Giới thiệu thư viện STL trong C++ và một số hàm phổ biến thường dùng.
    02/03/2016
    Interface Trong C#
    Giới thiệu về interface trong C#, ý nghĩa sử dụng, tính ứng dụng và cách ...
    Đọc Ghi File Cơ Bản Trong C#
    Hướng dẫn đọc và ghi file cơ bản sử dụng đối tượng File trong C#. Nhờ có ...
    Các Kiến Thức Cần Chuẩn Bị Cho Buổi Phỏng Vấn C++
    Các kiến thức cần chuẩn bị cho buổi phỏng vấn C++ và cho công việc C++.
    Thao Tác Với Chuỗi Trong C/C++
    Kiến thức cơ bản trong thao tác xử lý chuỗi trong C++.
    28/07/2015
    Struct Alignment trong C++
    Tìm hiểu về Struct Alignment trong C/C++.
    08/10/2015
    Bản Chất Của Biến Trong C/C++
    Tìm hiểu về bản chất của biến trong C++.
    16/01/2015
    Khi bạn nhấn vào liên kết sản phẩm do STDIO đề xuất và mua hàng, STDIO có thể nhận được hoa hồng. Điều này hỗ trợ STDIO tạo thêm nhiều nội dung hữu ích. Tìm hiểu thêm.
    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020