Lưu ý khi sử dụng operator[] của std::map

Hôm nay chúng ta sẽ bàn một chút về operator[] (element access) của std::map, tại sao phải lưu ý? Nó có khác gì khi sử dụng để access một element trong array bình thường không?

Đầu tiên chúng ta hãy xem xét định nghĩa của operator[] một chút, theo cplusplus.com: operator[]

If k matches the key of an element in the container, the function returns a reference to its mapped value.

If k does not match the key of any element in the container, the function inserts a new element with that key and returns a reference to its mapped value. Notice that this always increases the container size by one, even if no mapped value is assigned to the element (the element is constructed using its default constructor).

Đoạn trên có nghĩa là khi sử dụng operator[] : nếu truy xuất 1 key có trong map, nó sẽ trả về 1 reference tới giá trị của key đó. Còn nếu key đó không tồn tại trong map, nó sẽ insert 1 cái key mới bất kể không có 1 giá trị nào được gán cho key đó.

Chúng ta có thể thấy, nó khác với một array bình thưởng ở chỗ, operator[] của map sẽ insert một phần tử mới bất kể có được gán giá trị hay không. Cùng phân tích một đoạn code nhỏ dưới đây

RUN ONLINEGDB

Giải thích một chút về đoạn code trên. Function doSomething() là 1 dynamic function, nó sẽ trả ra một giá trị tuỳ thuộc vô từng lúc chạy chương trình, tôi giả sử trong trường hợp này doSomething() trả ra một giá trị là 3.

Bình thường chương trình hoạt động tốt, tuy nhiên đến một lúc nào đó doSomething() trả ra giá trị là 3, lúc này sau khi chạy tới line 27, check điều kiện coi myMap[key] có bằng “someThingWeWant” hay không. OK không có “someThingWeWant”. Tuy nhiên, lúc này chúng ta tưởng myMap chỉ có 3 phần tử trong khi hiện tại nó có 4 phần tử (vì operator[] đã tự động insert vô ) và chương trình sẽ có bug tiềm ẩn vì nếu giả sử chúng ta tiếp tục sử dụng myMap cho những phần code tiếp theo, nó sẽ không còn như những gì chúng ta nghĩ.

Hoặc như một trường hợp khác:

Chỉ là một hàm loop đơn giản, nhưng cũng có thể gây bug bất cứ lúc nào vì lúc này myMap đã bị thay đổi.

Vậy để giảm thiểu bug, khi muốn access tới 1 phần tử nào đó trong std::map mà không muốn thay đổi giá trị của phần tử đó, chúng ta nên sử dụng std::map::find thay cho operator[].

Bài viết liên quan