2009-10-20 51 views
8

Sự khác biệt giữa toán tử quá tải chỉ mục và phương thức chèn cho std :: map là gì?std :: sự khác biệt về bản đồ giữa chỉ mục và các cuộc gọi chèn

ví dụ:

some_map["x"] = 500; 

vs

some_map.insert(pair<std::string, int>("x", 500)); 
+0

Cách đầu tiên dễ đọc hơn;) – schnaader

+3

Sử dụng make_pair() sẽ giúp chèn vào vì nó có thể suy ra các loại đối số: "some_map.insert (std :: make_pair (" x ", 500));" –

+0

@Fred Larson: Mặc dù 'make_pair' bạn hiển thị sẽ suy ra' const char * 'và' int' để chuyển đổi ngầm từ một kiểu 'pair' thành' value_type' thực tế của 'map' sẽ được tạo ra. –

Trả lời

19

Tôi tin chèn() sẽ không ghi đè giá trị hiện có, và kết quả của các hoạt động có thể được kiểm tra bằng cách kiểm tra giá trị bool trong giá trị iterator/cặp trở

Việc chuyển nhượng để các nhà điều hành subscript [] chỉ ghi đè bất cứ điều gì ở đó (chèn một mục nếu chưa có mục nào)

Hoặc các toán tử chèn và [] có thể gây ra vấn đề nếu bạn không mong đợi hành vi đó và không thích ứng.

Ví dụ với chèn:

std::map< int, std::string* > intMap; 
std::string* s1 = new std::string; 
std::string* s2 = new std::string; 
intMap.insert(std::make_pair(100, s1)); // inserted 
intMap.insert(std::make_pair(100, s2)); // fails, s2 not in map, could leak if not tidied up 

và với [] điều hành:

std::map< int, std::string* > intMap; 
std::string* s1 = new std::string; 
std::string* s2 = new std::string; 
intMap[ 100 ] = s1; // inserted 
intMap[ 100 ] = s2; // inserted, s1 now dropped from map, could leak if not tidied up 

Tôi nghĩ rằng đó là đúng, nhưng chưa lập hồ sơ, như vậy có thể có các lỗi cú pháp

0

Phương pháp chèn chèn vào bản đồ, trong khi các nhà điều hành chỉ số quá tải sẽ trở lại nguyên tố này với key_value trọng nếu nó là trong bản đồ, nếu nó chưa có trong bản đồ thì nó sẽ chèn nó vào.

+0

Nó sẽ chỉ chèn vào bản đồ nếu một khóa đã cho chưa có. Nếu nó hiện diện, insert() sẽ không cập nhật giá trị trong khi gán cho toán tử [] sẽ. –

7

Đối với một map, biểu thức trước đây (operator[]) sẽ luôn thay thế phần giá trị của cặp khóa-giá trị bằng giá trị được cung cấp mới. Một cặp khóa-giá trị mới sẽ được chèn nếu một cặp khóa không tồn tại.

Ngược lại, insert sẽ chỉ chèn cặp khóa-giá trị mới nếu cặp khóa-giá trị với phần khóa được cung cấp không tồn tại trong bản đồ.

4

Ngoài thực tế là map::operator[] sẽ thay thế một giá trị hiện tại là operator[] đồ :: sẽ tạo và thêm vào bản đồ một mặc định giá trị hiện tại để thay thế trước khi thay thế xảy ra (gọi map::operator[]() đã trở lại một tài liệu tham khảo một cái gì đó). Đối với các mặt hàng đắt tiền để tạo ra điều này có thể là một vấn đề hiệu suất.

Xem "Mục 24: Chọn cẩn thận giữa map::operator[]map::insert khi hiệu quả là quan trọng" trong Scott Meyers' Effective STL.

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