2012-12-21 42 views
29

Tôi đã tự hỏi, tại sao mọi người lại viết điều này:Điểm của iter_swap là gì?

std::iter_swap(i, k); 

thay vì điều này?

std::swap(*i, *k); // saved a few keystrokes! 

Sau đó, tôi nhìn vào việc thực hiện các iter_swap, và tất nhiên nó chỉ sử dụng swap thay vì std::swap vì chúng tôi đã có trong namespace std, anyway. Điều đó dẫn tôi đến câu hỏi tiếp theo:

Tại sao ai sẽ viết này:

using std::swap; 
swap(a, b); 

thay vì điều này?

std::iter_swap(&a, &b); // saved an entire line of code! 

Có bất kỳ sự khác biệt/vấn đề quan trọng nào tôi nhìn thấy ở đây không?

+1

Mã tiết kiệm có thể đáng giá (giảm độ phức tạp dễ dàng hơn để giải thích) ... nhưng tiết kiệm * dòng * mã? Hoàn toàn vô dụng, thường phản tác dụng. –

+2

Không không không, bạn cần phải làm 'bằng cách sử dụng std :: iter_swap; iter_swap (i, k); 'vì' iter_swap' có thể đã được chuyên biệt hóa. (Chỉ đùa thôi.) Tôi nghĩ.) – Potatoswatter

+3

Bạn đã xem xét * một * thực hiện 'iter_swap', nhưng tại sao bạn cho rằng nó không thể được thực hiện với' std :: swap'? –

Trả lời

33

Từ các tài liệu SGI (here):

[1] Nói đúng ra, iter_swap là không cần thiết. Nó chỉ tồn tại vì lý do kỹ thuật: trong một số trường hợp, một số trình biên dịch gặp khó khăn khi thực hiện khấu trừ loại cần thiết để diễn giải hoán đổi (* a, * b).

10

Để trả lời câu hỏi thứ hai của bạn, using + swap cho phép trình biên dịch để sử dụng chức năng hoán đổi người dùng xác định rằng có thể hiệu quả hơn việc thực hiện mặc định (bằng cách sử dụng ADL). Nói rõ ràng std::swap ức chế ADL và bất kỳ phương thức hoán đổi tùy chỉnh nào có thể đã tìm thấy.

Đối với iter_swap có lẽ là có để sử dụng trong các mẫu và chỉ rõ ý định chứ không phải là trao đổi có thể cho biết bạn mong đợi một con trỏ.

+0

Oh Tôi đã bỏ qua điều này vì tôi hoàn toàn tin rằng Fred biết về ADL và std :: thành ngữ hoán đổi :) – sehe

+0

Không có 'std :: swap' gọi trong câu hỏi thứ hai của tôi. Quan điểm của tôi là 'std :: iter_swap' cũng sẽ nhận các hoán đổi do người dùng định nghĩa, mà không cần phải viết câu lệnh' using'. Đúng? – fredoverflow

+1

@FredOverflow: Nhưng không phải do người dùng định nghĩa 'iter_swap's;) – MSalters