2012-01-23 15 views
13

Tôi nhận thấy mình có thể nhận được tham chiếu iterator bằng cách gọi back() nhưng tại sao không trả lại bằng push_back()? Có phải vì lý do hiệu suất không? Hoặc là do an toàn ngoại lệ (tương tự như lý do tại sao pop_back() không trả lại giá trị xuất hiện)? Trong cả hai trường hợp, hãy giải thích.Tại sao các thùng chứa push_back trong vectơ <> và danh sách <> trả về tham chiếu đến phần tử được chèn?

+0

'back' không cung cấp cho bạn trình lặp. Nó cung cấp cho bạn một tham chiếu đến mục cuối cùng. Sau đó bạn có thể lấy '&' của mục đó, nhưng đây không phải là một trình lặp. Tôi nghĩ rằng cách duy nhất để có được một iterator đến mục cuối cùng của một danh sách là sử dụng 'rbegin()' hoặc 'end() - 1'. (Có thể cần phải là 'auto x = l.end(); --x;') –

+0

@AaronMcDaid: Cảm ơn bạn đã chỉ ra điều đó, lặp lại câu hỏi. – Samaursa

Trả lời

16

Các chức năng insert trả về một trình lặp cho một lý do rất đơn giản: người gọi không nhất thiết phải biết cách lấy một trình lặp cho phần tử đó. map::insertset::insert trả về một vì nếu không, người gọi sẽ phải tìm kiếm phần tử đó.

Khi bạn thực hiện vector::push_back, bạn biết nơi phần tử được chèn vào. Đó là --vector.end(). Bạn không cần phải tìm kiếm nó; nó là luôn luôn vị trí đó. Bạn có thể nhận được nó trong thời gian liên tục, và thời gian liên tục khá nhanh tại đó.

Vì vậy, thực sự không có điểm nào để trả lại nội dung mà người dùng đã biết.

+0

+1. Lập luận này có ý nghĩa. 'push_back' đẩy phần tử ở phía sau, vì vậy người gọi khá nhiều biết vị trí của phần tử và thứ lặp sẽ là gì. – Nawaz

+2

Người dùng biết * và có thể nhận được trong thời gian liên tục *. –

+0

@NicolBolas Bạn có một điểm. Tôi chỉ giả định OP muốn lấy một trình lặp để lấy một tham chiếu đến đối tượng được chèn vào. Tôi không thấy bất kỳ trường hợp sử dụng thực tế nào khác. – pmr

1

Tôi không biết nếu có lý do chính thức nhưng lý do chính đáng nhất mà tôi nghĩ đến là hiệu suất. Nếu bạn nhìn vào phần lớn các công dụng của push_backpush_front thì giá trị trả về sẽ không được sử dụng. Trường hợp một yếu tố được đẩy không phải là quá quan trọng vì nó được đẩy.

Tại sao trả lại giá trị không miễn phí gần như không bao giờ được sử dụng?

+3

Không nên trình biên dịch vứt bỏ nó tại thời gian biên dịch vì nó có thể thấy rõ sự lặp lại không được sử dụng? – Samaursa

+0

@Samaursa Nói chung nếu một phương thức cho trước tạo ra một giá trị trả về thì trình biên dịch không phải là tự do để tối ưu hóa việc tạo ra giá trị đó. Nó có thể có tác dụng phụ phụ thuộc vào người gọi/callee. Nó chắc chắn có thể loại bỏ kết quả nhưng điều đó không loại bỏ chi phí của việc tạo ra – JaredPar

+1

@Samaursa Trình biên dịch không thể vứt bỏ nó trừ khi cuộc gọi được gạch chân trong trường hợp nó có thể có khả năng nếu nó có thể chứng minh rằng việc xây dựng sự trở lại giá trị không có tác dụng phụ. –

0

Lý do là vector cung cấp phương thức insert trả về trình lặp đến vị trí được chèn. Tiêu chuẩn nhất quán trong đó push_back không trả lại giá trị nhưng một số hình thức insert sẽ, khi có sẵn và phù hợp.

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