2016-12-16 14 views
10

C++ chuẩn định nghĩa một constructor std::map sử dụng một std::initializer_list:std :: map danh sách initializer constructor

map(std::initializer_list<value_type> init, const Allocator&); 

Tuy nhiên, nơi được xác định những gì sẽ xảy ra nếu danh sách initializer chứa phím trùng lặp? Khóa đầu tiên có được chọn hay cuối cùng? Ví dụ:

std::map<std::string, int> my_map { 
    {"a", 1}, 
    {"a", 2} 
}; 

Trong thực tế, có vẻ như nó hoạt động như insert(), do đó bản đồ bây giờ sẽ chứa {a: 1}.

Tuy nhiên, tôi không thể tìm thấy bất kỳ điều gì trong tiêu chuẩn C++ về vấn đề này.

Trả lời

5

N4296 (~ C++ 14)

Bảng 102 - Yêu cầu chứa Associative

X(il); | Tương tự như X(il.begin(), il.end()).

Sau đó, từ trên cao trong bảng, cho ctor iterator:

Effects: Tạo thời trống container và chèn các yếu tố từ dãy [i, j) vào nó; sử dụng c làm đối tượng so sánh.

ij đáp ứng yêu cầu iterator đầu vào và tham khảo các yếu tố ngầm mui trần để value_type, [i,j) biểu thị một phạm vi hợp lệ,

Lưu ý rằng "và chèn các yếu tố" ở đây là không phải được đánh dấu để chỉ ra hàm insert, nhưng tôi cho rằng chúng tôi có thể diễn giải theo cách đó. Cũng lưu ý rằng ijđầu vào trình lặp, do đó phải được di chuyển theo thứ tự.

.

(Nó là hơi khó khăn hơn để tìm thông tin này, bởi vì các bảng tương đương đều có

il chỉ định một đối tượng kiểu initializer_list<value_type>

trên họ, như vậy có thể được tìm thấy bằng cách tìm kiếm initializer_list , nhưng đối với bảng này, từ này được chia thành hai dòng, với dấu gạch ngang ở dấu ngắt.)

+3

Về mặt kỹ thuật, ít nhất là từ các phần được trích dẫn, tiêu chuẩn dường như không quyết định trong đó hoặc der các yếu tố sẽ được chèn vào. – user2079303

+0

@ user2079303 Tốt hơn? – BoBTFish

+2

Tôi không chắc chắn nếu đó là đủ.Chắc chắn khi iterator được truyền chỉ đơn thuần là một iterator đầu vào, chúng phải được chèn theo thứ tự, nhưng iterator của initializer_list là một iterator truy cập ngẫu nhiên và tôi không thấy một quy tắc cấm chuyên môn hóa cho các kiểu vòng lặp khác nhau. – user2079303

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