Cách sử dụng Bản đồ có thứ tự C ++

How Use C Unordered Map



Bản đồ, còn được gọi là mảng kết hợp là một danh sách các phần tử, trong đó mỗi phần tử là một cặp khóa / giá trị. Vì vậy, mỗi khóa tương ứng với một giá trị. Các khóa khác nhau có thể có cùng giá trị, đối với công việc thông thường. Ví dụ, các phím có thể là danh sách các loại trái cây và các giá trị tương ứng, màu sắc của các loại trái cây. Trong C ++, bản đồ được thực hiện như một cấu trúc dữ liệu với các hàm thành viên và toán tử. Một bản đồ có thứ tự là một trong đó các cặp phần tử đã được sắp xếp theo thứ tự của các khóa. Bản đồ không có thứ tự là bản đồ không có thứ tự. Bài viết này giải thích cách sử dụng bản đồ có thứ tự C ++, được viết dưới dạng bản đồ không có thứ tự. Bạn cần có kiến ​​thức về con trỏ C ++ để hiểu được bài viết này. unsrdered_map là một phần của thư viện chuẩn C ++.

Lớp và Đối tượng

Lớp là một tập hợp các biến và hàm hoạt động cùng nhau, trong đó các biến không có giá trị được gán cho. Khi các giá trị được gán cho các biến, lớp sẽ trở thành một đối tượng. Các giá trị khác nhau được cung cấp cho cùng một lớp dẫn đến các đối tượng khác nhau; nghĩa là, các đối tượng khác nhau là cùng một lớp với các giá trị khác nhau. Tạo một đối tượng từ một lớp được cho là khởi tạo đối tượng.







Tên, unirdered_map, là một lớp. Một đối tượng được tạo từ lớp unardered_map có tên do người lập trình chọn.



Một hàm thuộc về một lớp là cần thiết để khởi tạo một đối tượng từ lớp đó. Trong C ++, hàm đó có cùng tên với tên của lớp. Các đối tượng được tạo (khởi tạo) từ lớp có các tên khác nhau do người lập trình đặt cho chúng.



Tạo một đối tượng từ lớp có nghĩa là xây dựng đối tượng; nó cũng có nghĩa là tức thời.





Một chương trình C ++ sử dụng lớp bản đồ không có thứ tự, bắt đầu bằng các dòng sau ở đầu tệp:

#bao gồm
#bao gồm
sử dụng không gian tên std;

Dòng đầu tiên là đầu vào / đầu ra. Dòng thứ hai là cho phép chương trình sử dụng tất cả các tính năng của lớp unardered_map. Dòng thứ ba cho phép chương trình sử dụng các tên trong không gian tên tiêu chuẩn.



Quá tải một chức năng

Khi hai hoặc nhiều chữ ký chức năng khác nhau có cùng tên, tên đó được cho là quá tải. Khi một hàm được gọi, số lượng và kiểu đối số sẽ xác định hàm nào thực sự được thực thi.

Xây dựng / Sao chép Xây dựng

Xây dựng đơn giản

Một bản đồ không có thứ tự có thể được xây dựng và gán các giá trị như sau:

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap;

umap['chuối'] = 'màu vàng';
umap['giống nho'] = 'màu xanh lá';
umap['quả sung'] = 'màu tía';

Khai báo bắt đầu với chuyên môn hóa mẫu với các kiểu cho các cặp khóa và giá trị. Tiếp theo là tên người lập trình đã chọn cho bản đồ; sau đó là dấu chấm phẩy. Đoạn mã thứ hai cho thấy cách gán giá trị cho các khóa của chúng.
Xây dựng bởi Initializer_list
Điều này có thể được thực hiện như sau:

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap({{'chuối', 'màu vàng'},
{'giống nho', 'màu xanh lá'}, {'quả sung', 'màu tía'}});

Xây dựng bằng cách gán Initializer_list
Thí dụ:

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap= {{'chuối', 'màu vàng'},
{'giống nho', 'màu xanh lá'}, {'quả sung', 'màu tía'}};

Xây dựng bằng cách sao chép một bản đồ không có thứ tự khác
Thí dụ:

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap1({{'chuối', 'màu vàng'},
{'giống nho', 'màu xanh lá'}, {'quả sung', 'màu tía'}});
sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap2(umap1);

Phần tử cặp

Đoạn mã sau cho biết cách tạo và truy cập phần tử cặp:

đôi<char, hăng sô char*>pr= {'NS', 'thì là ở'};
Giá cả<<pr.đầu tiên << ' ';
Giá cả<<pr.thứ hai << ' ';

Đầu ra là:

NS
thì là ở

đầu tiên và thứ hai là các từ dành riêng cho hai mục trong cặp. Các giá trị trong cặp vẫn có thể được thay đổi bằng cách sử dụng thứ nhất và thứ hai.

Một cặp được gọi, value_type trong chủ đề của bản đồ không có thứ tự.

Quyền truy cập phần tử không có thứ tự_map

mapped_type & operator [] (key_type && k)
Trả về giá trị cho khóa tương ứng. Thí dụ:

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap;

umap['chuối'] = 'màu vàng';
umap['giống nho'] = 'màu xanh lá';
umap['quả sung'] = 'màu tía';

hăng sô char *đúng=umap['giống nho'];

Giá cả<<đúng<<' ';

Đầu ra là: màu xanh lá cây. Các giá trị có thể được chỉ định theo cách tương tự - xem ở trên.

Dung lượng bản đồ không có thứ tự

size_type size () const noexcept
Trả về số lượng cặp trong bản đồ.

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap;

umap['chuối'] = 'màu vàng';
umap['giống nho'] = 'màu xanh lá';
umap['quả sung'] = 'màu tía';

Giá cả<<umap.kích thước() <<' ';

Đầu ra là 3.

bool blank () const noexcept

Trả về 1 cho true nếu bản đồ không có cặp và 0 cho false nếu bản đồ có cặp. Thí dụ:

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap;
Giá cả<<umap.trống() <<' ';

Đầu ra là 1.

Trả lại các Trình lặp lại và Lớp bản đồ không có thứ tự

Một trình lặp giống như một con trỏ nhưng có nhiều chức năng hơn con trỏ.

begin () noexcept

Trả về một trình lặp trỏ đến cặp đầu tiên của đối tượng bản đồ, như trong đoạn mã sau:

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap;

umap['chuối'] = 'màu vàng';umap['giống nho'] = 'màu xanh lá';umap['quả sung'] = 'màu tía';

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*> ::người lặp lạiiter=umap.bắt đầu();
đôi<hăng sô char*, hăng sô char*>pr= *iter;
Giá cả<<pr.đầu tiên << ',' <<pr.thứ hai << ' ';

Đầu ra là: vả, tím. Bản đồ chưa được sắp xếp.

begin () const noexcept;

Trả về một trình lặp trỏ đến phần tử đầu tiên của bộ sưu tập đối tượng bản đồ. Khi cấu trúc đối tượng được đặt trước bởi const, biểu thức begin () const được thực thi thay vì begin (). Trong điều kiện này, không thể sửa đổi các phần tử trong đối tượng. Ví dụ, nó được sử dụng trong đoạn mã sau.

hăng sôsơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap({{'chuối', 'màu vàng'},
{'giống nho', 'màu xanh lá'}, {'quả sung', 'màu tía'}});

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*> ::const_iteratoriter=umap.bắt đầu();
đôi<hăng sô char*, hăng sô char*>pr= *iter;
Giá cả<<pr.đầu tiên << ',' <<pr.thứ hai << ' ';

Đầu ra là: vả, tím. Bản đồ chưa được sắp xếp. Lưu ý rằng const_iterator đã được sử dụng lần này, thay vì chỉ trình lặp, để nhận trình lặp được trả về.

end () noexcept

Trả về một trình lặp trỏ ngay bên ngoài phần tử cuối cùng của đối tượng bản đồ.

end () const noexcept

Trả về một trình lặp trỏ ngay bên ngoài phần tử cuối cùng của đối tượng bản đồ. Khi việc xây dựng đối tượng bản đồ được đặt trước bởi const, biểu thức end () const được thực thi thay vì end ().

Các thao tác trên bản đồ không có thứ tự

tìm trình lặp (const key_type & k)

Tìm kiếm một cặp khóa đã cho trong bản đồ. Nếu nó được tìm thấy, nó sẽ trả về trình lặp. Nếu không tìm thấy, nó trả về một trình lặp chỉ đến cuối bản đồ, không phải là một cặp. Đoạn mã sau đây cho thấy cách sử dụng chức năng thành viên này:

sơ đồ không có thứ tự<char,char>umap;

umap['đến'] = 'NS';umap['NS'] = 'NS';umap['Và'] = 'NS';

sơ đồ không có thứ tự<char,char> ::người lặp lạiiter=umap.tìm thấy('NS');
nếu như (umap.tìm thấy('NS') ! =umap.kết thúc())
{
đôi<char,char>pr= *iter;
Giá cả<<pr.đầu tiên << ',' <<pr.thứ hai << ' ';
}

Đầu ra là: c, d

const_iterator find (const key_type & k) const;

Phiên bản này của hàm được gọi, nếu việc tạo bản đồ không có thứ tự bắt đầu bằng const, làm cho tất cả các phần tử của bản đồ ở chế độ chỉ đọc.

Các công cụ sửa đổi bản đồ không có thứ tự

ghép nối chèn (value_type && obj)
Một bản đồ không có thứ tự có nghĩa là các cặp không theo bất kỳ thứ tự nào. Vì vậy, chương trình sẽ chèn cặp vào bất kỳ nơi nào mà nó thấy thuận tiện. Hàm trả về, ghép nối. Nếu việc chèn thành công, bool sẽ là 1 đối với true, nếu không sẽ là 0 đối với false. Nếu việc chèn thành công, thì trình lặp sẽ trỏ đến phần tử mới được chèn. Đoạn mã sau minh họa việc sử dụng:

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap;

umap['chuối'] = 'màu vàng';
umap['giống nho'] = 'màu xanh lá';
umap['quả sung'] = 'màu tía';

umap.chèn({{'quả anh đào', 'mạng lưới'}, {'quả dâu', 'mạng lưới'}});

Giá cả<<umap.kích thước() << ' ';

Đầu ra là: 5. Có thể lắp nhiều hơn một cặp.

xóa size_type (const key_type & k)

Hàm này xóa một cặp khỏi bản đồ không có thứ tự. Đoạn mã sau minh họa:

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap;

umap['chuối'] = 'màu vàng';
umap['giống nho'] = 'màu xanh lá';
umap['quả sung'] = 'màu tía';

NStrên một=umap.tẩy xóa('giống nho');

Giá cả<<umap.kích thước() << ' ';

Đầu ra là 2.
void swap (không có thứ tự_map &)
Hai bản đồ không có thứ tự có thể được hoán đổi, như được minh họa trong đoạn mã này:

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap1= {{'chuối', 'màu vàng'},
{'giống nho', 'màu xanh lá'}, {'quả sung', 'màu tía'}, {'quả dâu', 'mạng lưới'}};

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap2= {{'quả anh đào', 'mạng lưới'}, {'Vôi', 'màu xanh lá'}};

umap1.tráo đổi(umap2);

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*> ::người lặp lạiiter1=umap1.bắt đầu();
đôi<hăng sô char*, hăng sô char*>pr1= *iter1;
sơ đồ không có thứ tự<hăng sô char*, hăng sô char*> ::người lặp lạiiter2=umap2.bắt đầu();
đôi<hăng sô char*, hăng sô char*>pr2= *iter2;

Giá cả<< 'Khóa đầu tiên và kích thước của umap1:'<<pr1.đầu tiên <<','<<umap1.kích thước() << ' ';
Giá cả<< 'Khóa đầu tiên và kích thước của umap2'<<pr2.đầu tiên <<','<<umap2.kích thước() << ' ';
sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap1= {{'chuối', 'màu vàng'},
{'giống nho', 'màu xanh lá'}, {'quả sung', 'màu tía'}, {'quả dâu', 'mạng lưới'}};
sơ đồ không có thứ tự<hăng sô char*, hăng sô char*>umap2= {{'quả anh đào', 'mạng lưới'}, {'Vôi', 'màu xanh lá'}};

umap1.tráo đổi(umap2);

sơ đồ không có thứ tự<hăng sô char*, hăng sô char*> ::người lặp lạiiter1=umap1.bắt đầu();
đôi<hăng sô char*, hăng sô char*>pr1= *iter1;
sơ đồ không có thứ tự<hăng sô char*, hăng sô char*> ::người lặp lạiiter2=umap2.bắt đầu();
đôi<hăng sô char*, hăng sô char*>pr2= *iter2;

Giá cả<< 'Khóa đầu tiên và kích thước của umap1:'<<pr1.đầu tiên <<','<<umap1.kích thước() << ' ';
Giá cả<< 'Khóa đầu tiên và kích thước của umap2'<<pr2.đầu tiên <<','<<umap2.kích thước() << ' ';

Đầu ra là:

Khóa đầu tiên và kích thước của umap1: Lemon, 2

Phím đầu tiên và kích thước của umap2 dâu, 4

Bản đồ chưa được sắp xếp. Lưu ý rằng độ dài của bản đồ được tăng lên nếu cần thiết. Các kiểu dữ liệu phải giống nhau.

Lớp và các đối tượng khởi tạo của nó

Giá trị là một kiểu dữ liệu, vì một đối tượng được khởi tạo là một lớp. Việc xây dựng bản đồ không có thứ tự cũng có thể chấp nhận một lớp làm kiểu dữ liệu. Chương trình sau đây minh họa điều này:

#bao gồm
#bao gồm
sử dụng không gian tên std;

lớp TheCla
{
công cộng:
NStrên một;
tĩnh charch;

vô hiệuhàm số(charkhông, hăng sô char *P)
{
Giá cả<< 'Có ' <<trên một<< 'sách đáng giá' <<không<<P<< ' trong cửa hàng.' << ' ';
}
tĩnh vô hiệuniềm vui(charch)
{
nếu như (ch== 'đến')
Giá cả<< 'Chức năng thành viên tĩnh chính thức' << ' ';
}
};

NSchủ chốt()
{
TheCla obj1;TheCla obj2;TheCla obj3;TheCla obj4;TheCla obj5;

sơ đồ không có thứ tự<hăng sô char*,TheCla>umap;
umap= {{'chuối',obj1}, {'giống nho',obj2}, {'quả sung',obj3}, {'quả dâu',obj4}, {'Vôi',obj5}};

Giá cả<<umap.kích thước() << ' ';

trở lại 0;
}

Đầu ra là: 5.

Định nghĩa lớp có hai thành viên công cộng dữ liệu và hai chức năng thành viên công khai. Trong hàm main (), các đối tượng khác nhau cho lớp được khởi tạo. Sau đó, một bản đồ không có thứ tự sẽ được khởi tạo, trong đó mỗi cặp bao gồm tên của một loại quả và một đối tượng từ lớp. Kích thước của bản đồ được hiển thị. Chương trình biên dịch không có cảnh báo hoặc thông báo lỗi.

Ứng dụng của bản đồ

Mảng liên kết một chỉ mục với giá trị. Các cặp khóa / giá trị tồn tại trong nhiều tình huống trong cuộc sống, chúng có thể được lập trình. Cặp khóa / giá trị của trái cây / màu sắc chỉ là một ví dụ. Một ví dụ khác là tên của mọi người và tuổi của họ. Trong trường hợp này, cặp sẽ là một loại, một cặp. Nó cũng có thể là cặp. Trong trường hợp thứ hai, chỉ thị tiền xử lý sẽ được sử dụng. Một cặp khóa / giá trị vẫn có thể là tên của các cặp đã kết hôn. Ở những quốc gia có chế độ đa thê, sẽ có những người vợ khác nhau cho một người đàn ông.

Hình thành bản đồ

Bản đồ không phải là một mảng hai chiều, có hai cột. Một bản đồ hoạt động với một hàm băm. Khóa được mã hóa bởi hàm băm, thành một số nguyên của một mảng. Đó là mảng này chứa các giá trị. Vì vậy, thực sự có một mảng với các giá trị và các khóa được ánh xạ tới các chỉ số của mảng và do đó, sự tương ứng giữa các khóa và giá trị được tạo ra. Băm là một chủ đề mở rộng và không được đề cập trong bài viết này.

Phần kết luận

Bản đồ, còn được gọi là mảng kết hợp là một danh sách các phần tử, trong đó mỗi phần tử là một cặp khóa / giá trị. Vì vậy, mỗi khóa tương ứng với một giá trị. Trong C ++, bản đồ được thực hiện như một cấu trúc dữ liệu với các hàm thành viên và toán tử. Một bản đồ có thứ tự là một trong đó các cặp phần tử đã được sắp xếp theo thứ tự của các khóa. Bản đồ không có thứ tự là bản đồ không có thứ tự.

Về mặt kỹ thuật, một hàm băm bao gồm các phần tử cặp. Trên thực tế, cặp là một cấu trúc dữ liệu toàn bộ với các hàm thành viên và toán tử của nó. Hai tham số mẫu cho cặp là hai tham số mẫu giống nhau cho bản đồ không có thứ tự.

Danh sách khởi tạo cho bản đồ là một mảng của các ký tự. Mỗi chữ bên trong bao gồm hai đối tượng, cặp khóa / giá trị.

Các hàm thành viên và toán tử cho bản đồ chưa có thứ tự có thể được phân loại theo các tiêu đề sau: bản dựng không có thứ tự / xây dựng bản sao, Dung lượng bản đồ không có thứ tự, Trình lặp bản đồ không có thứ tự, Thao tác bản đồ không có thứ tự và Bản đồ sửa đổi không có thứ tự.

Một bản đồ không có thứ tự được sử dụng khi một khóa phải được ánh xạ tới một giá trị.

Chrys