Bản đồ trong C++ Thư viện mẫu chuẩn (STL)
Bản đồ trong đó là gì C++? Cú pháp
In C++, Một MAP là một thùng chứa kết hợp lưu trữ các mục ở dạng được ánh xạ. Mỗi mục trong bản đồ bao gồm khóa-giá trị và giá trị được ánh xạ. Hai giá trị được ánh xạ không thể chia sẻ cùng một giá trị khóa.
Các giá trị khóa rất tốt cho việc sắp xếp và xác định các phần tử một cách duy nhất. Các giá trị được ánh xạ là để lưu trữ nội dung được liên kết với khóa. Cả hai có thể khác nhau về loại, nhưng loại thành viên kết hợp chúng thông qua loại cặp kết hợp cả hai.
Tại sao nên sử dụng std::map?
Dưới đây là những lý do nên sử dụng bản đồ:
- std:: map chỉ lưu trữ các khóa duy nhất theo thứ tự được sắp xếp dựa trên tiêu chí sắp xếp đã chọn.
- Thật dễ dàng và nhanh hơn để tìm kiếm các phần tử bằng cách sử dụng phím.
- Chỉ có một phần tử được gắn vào mỗi khóa.
- std::map có thể được sử dụng như một mảng kết hợp.
- std::map có thể triển khai được bằng cây nhị phân (cân bằng).
cú pháp
Để khai báo std::map, hãy sử dụng cú pháp sau:
std::map<key_datatype, value_datatype>map_name;
- Sản phẩm
key_datatype
biểu thị kiểu dữ liệu của các phím bản đồ. - Sản phẩm
value_datatype
biểu thị kiểu dữ liệu của các giá trị tương ứng với các khóa bản đồ. - Sản phẩm
map_name
là tên của bản đồ.
Ví dụ:
map<string, int> my_map;
Chúng tôi đã khai báo một bản đồ có tên my_map
. Bản đồ sẽ có một chuỗi như chính kiểu dữ liệu và số nguyên như giá trị loại dữ liệu.
Các loại thành viên
Các hàm thành viên có thể sử dụng các kiểu thành viên sau đây làm tham số hoặc kiểu trả về:
- loại chính: Khóa (Tham số đầu tiên trong mẫu)
- ánh xạ_type: T (Tham số thứ hai trong mẫu)
- key_compare: So sánh (Tham số thứ ba trong mẫu)
- phân bổ_type: Alloc (Tham số thứ tư trong mẫu)
- giá trị_type: đôi
- giá trị_so sánh: Lớp hàm lồng nhau để so sánh các phần tử
- tài liệu tham khảo: allocator_type::reference
- const_reference: allocator_type::const_reference
- con trỏ: allocator_type::con trỏ
- const_pointer: allocator_type::const_pointer
- vòng lặp: một trình vòng lặp hai chiều tới value_type
- const_iterator: một trình vòng lặp hai chiều tới const value_type
- đảo ngược_iterator: một trình vòng lặp ngược
- const_reverse_iterator: một trình vòng lặp ngược không đổi
- sự khác biệt_type: ptrdiff_t
- kích thước_type: kích thước_t
Các hàm tích hợp của std::map
std::map đi kèm với các chức năng sẵn có. Một số trong số này bao gồm:
- bắt đầu() - Hàm này trả về iterator cho mục đầu tiên của bản đồ.
- kích cỡ() -Hàm này trả về số lượng mục trong bản đồ.
- trống() -Hàm này trả về giá trị Boolean biểu thị liệu bản đồ có trống hay không.
- chèn(cặp(khóa,giá trị)) – Hàm này chèn cặp khóa-giá trị mới vào bản đồ.
- tìm(val) – Hàm này cung cấp trình lặp cho phần tử val nếu tìm thấy. Nếu không, nó sẽ trả về m.end().
- Xóa (vị trí lặp) - Hàm này xóa mục tại vị trí được chỉ ra bởi iterator.
- xóa(const g) – Hàm này xóa khóa-giá trị g khỏi bản đồ.
- Thông thoáng () -Chức năng này xóa tất cả các mục khỏi bản đồ.
Lặp lại các phần tử bản đồ
Bạn có thể lặp lại các thành phần bản đồ. Chúng ta chỉ cần tạo một iterator và sử dụng nó cho việc này.
Ví dụ:
Ví dụ 1:
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<int, string> Students; Students.insert(std::pair<int, string>(200, "Alice")); Students.insert(std::pair<int, string>(201, "John")); cout << "Map size is: " << Students.size() << endl; cout << endl << "Default map Order is: " << endl; for (map<int, string>::iterator it = Students.begin(); it != Students.end(); ++it) { cout << (*it).first << ": " << (*it).second << endl; } }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Đưa tệp tiêu đề iostream vào mã của chúng tôi để sử dụng các chức năng của nó.
- Đưa tệp tiêu đề chuỗi vào mã của chúng tôi để sử dụng các chức năng của nó.
- Đưa tệp tiêu đề bản đồ vào mã của chúng tôi để sử dụng các chức năng của nó.
- Bao gồm không gian tên std vào mã của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
- Gọi
main()
chức năng. { đánh dấu sự bắt đầu của phần thân hàm. - Tạo một bản đồ có tên là Học sinh trong đó các khóa sẽ là số nguyên và các giá trị sẽ là chuỗi.
- Chèn giá trị vào bản đồ Học sinh. Khóa 200 và giá trị Alice sẽ được chèn vào bản đồ.
- Chèn giá trị vào bản đồ Học sinh. Khóa 201 và giá trị John sẽ được chèn vào bản đồ.
- Sử dụng
size()
để lấy kích thước của bản đồ có tên là Sinh viên. Điều này sẽ trả về 2. - In một số văn bản trên bảng điều khiển.
- Sử dụng vòng lặp for để tạo một trình vòng lặp được đặt tên là nó để lặp qua các phần tử của bản đồ có tên là Học sinh.
- In các giá trị của bản đồ Học sinh trên bảng điều khiển.
- Kết thúc phần thân của vòng lặp for.
- Phần cuối của cơ thể
main()
chức năng.
Chèn dữ liệu vào std::map
Bạn có thể nhập các mục vào std::map bằng cách sử dụng insert()
chức năng. Hãy nhớ rằng các phím std::map phải là duy nhất.
Vì vậy, trước tiên nó sẽ kiểm tra xem mỗi khóa có xuất hiện trên bản đồ hay không. Nếu có, mục nhập sẽ không được chèn nhưng nó trả về trình vòng lặp cho mục nhập hiện có. Nếu nó không xuất hiện, mục này sẽ được chèn vào.
Hàm này có các biến thể sau:
- chèn (cặp) – với biến thể này, một cặp khóa-giá trị sẽ được chèn vào bản đồ.
- chèn(start_itr, end_itr) – với biến thể này, các mục sẽ được chèn trong phạm vi được xác định bởi start_itr và end_itr từ bản đồ khác.
Sản phẩm chèn_or_assing() chức năng hoạt động theo cách tương tự như insert()
nhưng nếu khóa đã cho đã tồn tại trên bản đồ thì giá trị của nó sẽ bị sửa đổi.
Ví dụ 2:
#include <map> #include <iostream> using namespace std; int main() { map<int, int> m{ {1,3} , {2,4} , {3,5} }; m.insert({ 5, 6 }); m.insert({ 1, 8 }); m.insert_or_assign(1, 6); cout << "Key\tElement\n"; for (auto itr = m.begin(); itr != m.end(); ++itr) { cout << itr->first << '\t' << itr->second << '\n'; } return 0; }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Đưa tệp tiêu đề bản đồ vào mã của chúng tôi để sử dụng các chức năng của nó.
- Đưa tệp tiêu đề iostream vào mã của chúng tôi để sử dụng các chức năng của nó.
- Bao gồm không gian tên std vào mã của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
- Gọi
main()
chức năng. { đánh dấu sự bắt đầu của phần thân hàm. - Tạo một bản đồ có tên m trong đó các khóa sẽ là số nguyên và các giá trị sẽ là số nguyên. Ba mục đã được đưa vào bản đồ.
- Chèn một mục mới vào bản đồ m. Khóa 5 và giá trị 6 sẽ được chèn vào bản đồ.
- Đang cố gắng thực hiện một mục nhập vào một khóa đã có sẵn. Vì khóa 1 đã tồn tại trên bản đồ nên việc nhập sẽ không được thực hiện.
- Sử dụng
insert_or_assign()
chức năng chèn hoặc sửa đổi một mục hiện có. Vì khóa 1 đã tồn tại nên giá trị của nó sẽ được thay đổi thành 6. - In một số văn bản trên bảng điều khiển. Ký tự “\t” tạo khoảng trắng theo chiều ngang trong khi ký tự “\n” di chuyển con trỏ chuột sang dòng tiếp theo.
- Sử dụng vòng lặp for để tạo một trình lặp có tên itr để lặp qua các phần tử của bản đồ có tên là m.
- In các giá trị của bản đồ m trên bảng điều khiển. Ký tự “\t” tạo khoảng trắng theo chiều ngang giữa mỗi khóa và giá trị tương ứng của nó. Ngược lại, ký tự “\n” di chuyển con trỏ chuột sang dòng tiếp theo sau mỗi lần lặp.
- Kết thúc phần thân của vòng lặp for.
- Chương trình phải trả về giá trị sau khi hoàn thành thành công.
- Phần cuối của cơ thể
main()
chức năng.
Tìm kiếm trong bản đồ
Chúng ta có thể sử dụng find()
hàm tìm kiếm các phần tử trong bản đồ theo khóa của chúng. Nếu không tìm thấy khóa, hàm trả về std::map::end. Nếu không, một trình lặp của phần tử được tìm kiếm sẽ được trả về.
Ví dụ 3:
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<int, string> Students; Students.insert(std::pair<int, string>(200, "Alice")); Students.insert(std::pair<int, string>(201, "John")); std::map<int, string>::iterator it = Students.find(201); if (it != Students.end()) { std::cout << endl << "Key 201 has the value: => "<< Students.find(201)->second << '\n'; } }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Đưa tệp tiêu đề iostream vào mã của chúng tôi để sử dụng các chức năng của nó mà không gặp lỗi.
- Đưa tệp tiêu đề chuỗi vào mã của chúng tôi để sử dụng các chức năng của nó mà không gặp lỗi.
- Đưa tệp tiêu đề bản đồ vào mã của chúng tôi để sử dụng các chức năng của nó mà không gặp lỗi.
- Bao gồm không gian tên std vào mã của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
- Gọi
main()
chức năng. Dấu { đánh dấu sự bắt đầu của phần thânmain()
chức năng. - Tạo bản đồ có tên Học sinh có khóa sẽ là chuỗi số nguyên và giá trị.
- Chèn giá trị vào bản đồ Học sinh. Khóa 200 và giá trị Alice sẽ được chèn vào bản đồ.
- Chèn giá trị vào bản đồ Học sinh. Khóa 201 và giá trị John sẽ được chèn vào bản đồ.
- Tìm giá trị liên quan đến khóa 201.
- Sử dụng câu lệnh if để kiểm tra xem giá trị của khóa có được tìm thấy hay không.
- In giá trị của khóa cùng với một số văn bản trên bảng điều khiển.
- Kết thúc phần thân của câu lệnh if.
- Phần cuối của cơ thể
main()
chức năng.
Xóa dữ liệu khỏi bản đồ
Chúng ta có thể sử dụng erase()
chức năng xóa một giá trị khỏi bản đồ. Chúng ta chỉ cần tạo một iterator trỏ đến phần tử cần xóa. Trình vòng lặp sau đó được chuyển đến erase()
chức năng.
Ví dụ 4:
#include <iostream> #include <string> #include <map> using namespace std; int main() { map<std::string, int> my_map; my_map.insert(std::make_pair("cow", 1)); my_map.insert(std::make_pair("cat", 2)); my_map["lion"] = 3; map<std::string, int>::iterator it = my_map.find("cat"); my_map.erase(it); for (map<string, int>::iterator it = my_map.begin(); it != my_map.end(); ++it) cout << (*it).first << ": " << (*it).second << endl; return 0; }
Đầu ra:
Đây là ảnh chụp màn hình của mã:
Giải thích mã:
- Đưa tệp tiêu đề iostream vào mã của chúng tôi để sử dụng các chức năng của nó.
- Đưa tệp tiêu đề chuỗi vào mã của chúng tôi để sử dụng các chức năng của nó.
- Đưa tệp tiêu đề bản đồ vào mã của chúng tôi để sử dụng các chức năng của nó.
- Bao gồm không gian tên std vào mã của chúng tôi để sử dụng các lớp của nó mà không cần gọi nó.
- Gọi
main()
chức năng. Dấu { đánh dấu sự bắt đầu của phần thânmain()
chức năng. - Tạo bản đồ có tên my_map có khóa sẽ là chuỗi và giá trị số nguyên.
- Chèn giá trị vào bản đồ my_map. Khóa Cow và giá trị 1 sẽ được chèn vào bản đồ.
- Chèn giá trị vào bản đồ my_map. Một khóa Cat và giá trị 2 sẽ được chèn vào bản đồ.
- Thêm giá trị 3 vào bản đồ my_map bằng phím sư tử.
- Tạo một trình lặp để lặp qua bản đồ my_map để tìm key cat.
- Xóa phần tử được trỏ bởi iterator.
- Sử dụng trình vòng lặp để lặp qua các phần tử của bản đồ my_map từ đầu đến cuối.
- In nội dung của bản đồ my_map trên bảng điều khiển.
- Chương trình phải trả về đầu ra sau khi hoàn thành thành công.
- Phần cuối của cơ thể
main()
chức năng.
Tổng kết
- Bản đồ là một thùng chứa kết hợp lưu trữ các mục ở dạng được ánh xạ.
- Mỗi mục trong bản đồ có một giá trị khóa và một giá trị được ánh xạ.
- Trong bản đồ, hai giá trị được ánh xạ không thể chia sẻ các giá trị chính.
- Các giá trị chính giúp sắp xếp và xác định các phần tử một cách duy nhất.
- Các giá trị được ánh xạ giúp lưu trữ nội dung được liên kết với khóa.
- C++ bản đồ lưu trữ các khóa duy nhất theo thứ tự được sắp xếp.
- Để làm việc với C++ map, chúng tôi tạo một trình vòng lặp để lặp lại các phần tử.
- Với trình lặp, chúng ta có thể thực hiện các tác vụ như tìm kiếm và xóa các mục khỏi bản đồ.