2013-04-30 25 views
16

Trong hashmap Java:Trong unordered_map của C++ 11, làm thế nào để cập nhật giá trị của một khóa cụ thể?

map.put(key, new_value) 

sẽ cập nhật sự xâm nhập của key = quan trọng với new_value nếu nó tồn tại trong hashmap.

Cách chính xác để thực hiện điều tương tự trong unordered_map của C++ 11 là gì?

Tôi chưa tìm thấy API như updateXXX và tài liệu cho biết hàm unordered_map :: insert sẽ chỉ thành công khi không có bất kỳ cặp nào như vậy với khóa.

Trả lời

21

Nếu bạn biết rằng khóa nằm trong bản đồ, bạn có thể sử dụng operator[] trả về tham chiếu đến giá trị được ánh xạ. Do đó nó sẽ là map[key] = new_value. Tuy nhiên, hãy cẩn thận vì điều này sẽ chèn (key, new_value) nếu khóa không tồn tại trong bản đồ.

Bạn cũng có thể sử dụng find mà trả về một iterator với giá trị:

auto it = map.find(key) 
if(it != map.end()) 
    it->second = new_value; 
+1

Hoặc 'std :: unordered_map :: at'. Nó sẽ ném ngoại lệ 'std :: out_of_range', nếu phần tử có' khóa' được chỉ định không tồn tại. – soon

+0

Cảm ơn! Tôi đã sử dụng 'unordered_map :: const_iterator it = map.find (key)' và tôi gặp lỗi khi cố gắng gán 'new_value' cho' it-> second'. 'auto' hoạt động hoàn hảo. Tôi cần tìm hiểu thêm về C++ .. – Faraway

+1

@Yeclipse Đó là bởi vì bạn đang sử dụng 'const_iterator' - điều này có nghĩa là những gì mà trình vòng lặp" trỏ tới "là' const' (nghĩa là, nó không thể thay đổi được). Sửa đổi nó thành 'unordered_map :: iterator it = map.find (key)' và nó sẽ hoạt động - đây là những gì 'auto' được suy ra nó như là. – Yuushi

2

Tôi nghĩ rằng Java map.put chèn phần tử nếu nó không phải là đã có trong bản đồ và cập nhật nó nếu nó được trong bản đồ , xem put:

đặt

công V đặt (key K, V giá trị)

Kết hợp giá trị được chỉ định với khóa được chỉ định trong bản đồ này. Nếu trước đây bản đồ có chứa ánh xạ cho khóa, giá trị cũ sẽ được thay thế.

này sẽ tương đương với unordered_map::operator[]:

Nếu k phù hợp với chìa khóa của một phần tử trong container, hàm trả về một tham chiếu đến giá trị ánh xạ của nó.

Nếu k không khớp với khóa của bất kỳ phần tử nào trong vùng chứa, hàm sẽ chèn phần tử mới với khóa đó và trả về tham chiếu đến giá trị được ánh xạ của nó. Lưu ý rằng điều này luôn làm tăng kích thước vùng chứa bằng một, ngay cả khi không có giá trị được ánh xạ nào được gán cho phần tử (phần tử được xây dựng bằng cách sử dụng hàm tạo mặc định của nó).

Các vấn đề liên quan