2016-03-08 17 views
6

tôi đã nhận thấy có 2 cách để có được những iterator cuối của một vector (hoặc lớp container khác):Sự khác nhau giữa std :: cuối (MyVector) và myVector.end()

std::end(myVector) 

myVector.end() 

cũng vậy với chức năng khác nhau khác iterator container, begin, cend, cbegin, rend, rbegin, crend, crbegin, find, vv Những gì tôi đang tự hỏi là có sự khác biệt về chức năng giữa chúng không? Và nếu không, có một số lý do lịch sử để có cả hai người trong số họ?

(Xin lỗi nếu điều này là một bản sao, tôi đã tìm kiếm khắp nơi, và tìm thấy nhiều nguồn cho một hay khác của các phương pháp này, nhưng không ai đề cập đến cả hai hoặc so sánh hai.)

Trả lời

7

Có một lý do lịch sử: trước C++ 11, chỉ tồn tại các phiên bản chức năng thành viên. C++ 11 đã thêm vào những người không phải là thành viên, cũng làm việc cho các mảng kiểu C đơn giản, vì vậy có thể được coi là tổng quát hơn.

int a[] = {3, 1, 5, 67, 28, -12}; 
std::sort(std::begin(a), std::end(a)); 

Khi áp dụng cho các container tiêu chuẩn thư viện, ảnh hưởng của std::beginstd::end là để gọi begin()end() hàm thành viên của container, vì vậy không có sự khác biệt chức năng.

C++ 14 thêm std::cbegin, std::cend, , std::rend, std::crbeginstd::crend, với hành vi tương tự.

+0

Vì vậy, sự khác biệt duy nhất là phương pháp mới cũng hoạt động trên mảng? Đuợc. Hữu ích, tôi đoán - tôi có thể phải hỏi người đã viết mã này tại sao chúng ta sử dụng nó trên 'vectơ' và chỉ làm cho mã không cần thiết tiết lộ nhiều hơn, nhưng tôi đoán câu trả lời cho câu hỏi của tôi. –

+0

@DarrelHoffman Tôi đoán đó là vấn đề lựa chọn, nhưng tôi thích sử dụng các chức năng không phải thành viên nếu có thể. BTW nếu tham số là một thùng chứa thư viện chuẩn, 'std ::' có thể được bỏ qua, và 'bắt đầu (v)' không có nhiều chi tiết hơn 'v.begin()'. – juanchopanza

+0

Có, mặc dù có khả năng nguy hiểm trong trường hợp này - Phần lớn codebase của chúng tôi được chia sẻ bởi nhiều nhóm ở các phần khác nhau của thế giới, một số người vẫn đang chạy C++ 0x vì lý do cũ. Tôi không mong đợi phần đặc biệt này của mã gây ra vấn đề, nhưng đã có những xung đột trong quá khứ về điều đó. (Chúng tôi phải đánh dấu các lớp nhất định là "Không có C++ 11 được phép" để nó không phá vỡ các nhóm xây dựng khác ...) –

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