Iterator-> thứ hai có nghĩa là gì?


157

Trong C ++, loại a là std::map<>::iteratorgì?

Chúng ta biết rằng một đối tượng itkiểu std::map<A,B>::iteratorcó quá tải operator ->trả về a std::pair<A,B>*và rằng đối tượng std::pair<>có a firstsecondthành viên.

Nhưng, hai thành viên này tương ứng với cái gì, và tại sao chúng ta phải truy cập vào giá trị được lưu trữ trên bản đồ it->second?


14
A std::maplưu trữ một khóa và một giá trị . map::iterator.secondđề cập đến giá trị .
Alok Lưu

Câu trả lời:


247

Tôi chắc rằng bạn biết rằng một std::vector<X>cửa hàng toàn bộ các Xđối tượng, phải không? Nhưng nếu bạn có một std::map<X, Y>, những gì nó thực sự lưu trữ là cả một std::pair<const X, Y>s. Đó chính xác là bản đồ là gì - nó kết hợp các khóa và các giá trị liên quan.

Khi bạn lặp lại qua một std::map, bạn đang lặp lại tất cả những điều này std::pair. Khi bạn hủy đăng ký một trong các trình vòng lặp này, bạn sẽ nhận được một std::pairkhóa chứa và giá trị liên quan của nó.

std::map<std::string, int> m = /* fill it */;
auto it = m.begin();

Ở đây, nếu bạn làm bây giờ *it, bạn sẽ nhận được std::pairphần tử đầu tiên trong bản đồ.

Bây giờ loại std::paircho phép bạn truy cập vào các phần tử của nó thông qua hai thành viên: firstsecond. Vì vậy, nếu bạn có một cuộc std::pair<X, Y>gọi p, p.firstlà một Xđối tượng và p.secondlà một Yđối tượng.

Vì vậy, bây giờ bạn biết rằng việc hủy bỏ hội thảo mà một std::maptrình vòng lặp cung cấp cho bạn std::pair, sau đó bạn có thể truy cập các phần tử của nó với firstsecond. Ví dụ, (*it).firstsẽ cung cấp cho bạn chìa khóa và (*it).secondsẽ cung cấp cho bạn giá trị. Đây là tương đương với it->firstit->second.


4
Tại sao họ không sử dụng [0] và [1] (cho "thứ nhất" và "thứ hai") như mọi thứ khác trong lập trình?

21
@AdamCross Vì operator[]phải trả về một loại cụ thể nhưng firstsecondcó thể có các loại khác nhau. Mặt khác, std::tuplecó một chức năng trợ giúp đặc biệt std::getđể truy cập các phần tử của nó theo chỉ mục.
Joseph Mansfield

16

Loại phần tử của một std::map(cũng là loại biểu thức thu được bằng cách hủy bỏ trình duyệt lặp của bản đồ đó) có khóa Kvà giá trị Vstd::pair<const K, V>- khóa là constđể ngăn bạn can thiệp vào việc sắp xếp nội bộ các giá trị bản đồ.

std::pair<>có hai thành viên được đặt tên firstsecond(xem tại đây ), với ý nghĩa khá trực quan. Do đó, đưa ra một trình vòng lặp icho một bản đồ nhất định, biểu thức:

i->first

Tương đương với:

(*i).first

Đề cập đến phần tử ( ) đầu tiênconst của pairđối tượng được chỉ ra bởi trình vòng lặp - tức là nó đề cập đến một khóa trong bản đồ. Thay vào đó, biểu thức:

i->second

Tương đương với:

(*i).second

Đề cập đến yếu tố thứ hai của pair- tức là giá trị tương ứng trong bản đồ.


5
Các từ "khóa" và "giá trị" sẽ trực quan hơn "đầu tiên" và "thứ hai", ngụ ý việc đặt hàng.
ahoffer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.