2010-01-21 39 views
17

Xin lỗi nếu điều này đã được yêu cầu trước đó, nhưng tôi tự hỏi việc sử dụng std::vector::front() là gì.STD :: vector :: front() được sử dụng để làm gì?

Có lý do để sử dụng ví dụ: myvector.front() thay vì myvector[0] hoặc myvector.at(0)?

+0

thú vị hơn ... tại sao có mặt trước() khi đã bắt đầu()? – Inverse

+0

@Inverse: vì bộ điều hợp container 'std :: queue' và' std :: stack' có 'front()' nhưng không phải 'begin()'. –

+0

Và để nhất quán với 'back()', 'myvector [myvector.size() - 1]' không phải là thẳng về phía trước. – dalle

Trả lời

17

Một số thuật toán chung cũng hoạt động trên danh sách sử dụng nó.

Đây là một ví dụ về một nguyên tắc chung: nếu bạn cung cấp các phụ kiện cho tất cả các ngữ nghĩa bạn hỗ trợ, không chỉ là thực hiện bạn hỗ trợ, đó là dễ dàng hơn để viết quát và do đó dễ dàng hơn để sử dụng lại mã.

+1

+1: Chỉnh sửa vững chắc. –

+1

Ah, vì vậy, nó phù hợp hơn với các lớp container khác. Chỉ cần ra khỏi tò mò: là vector :: front() tương đương với [0] hoặc đến (0)? Ý tôi là, điều gì xảy ra nếu vectơ trống? – Tim

+1

@Tim: Câu hỏi hay. Wikipedia cho biết hành vi không xác định: http://en.wikipedia.org/wiki/Vector_(C%2B%2B) và http://fredosaurus.com/notes-cpp/stl-containers/sequence-functions.html nói tương tự như [0] mà tôi cho là cũng không xác định nếu vectơ trống. – dmckee

13

Nếu loại myvector thay đổi thành loại dữ liệu khác không thể lập chỉ mục, chẳng hạn như danh sách, bạn sẽ không phải thay đổi mã truy cập vào mặt trước của vùng chứa.

+2

Câu trả lời của bạn và của người đăng trước phải được kết hợp. Tóm tắt khái niệm + ví dụ cụ thể cho chiến thắng. – Omnifarious

4

Làm điều này cung cấp một thứ gọi là đa hình tĩnh.

Giả sử tôi đã viết một thuật toán sử dụng lớp xếp hàng. Nó có hàm front() để lấy phần tử tiếp theo của hàng đợi và hàm enqueue() để thêm vào cuối hàng đợi. Bây giờ chúng ta hãy nói rằng tôi phát hiện ra rằng lớp hàng đợi này được viết kém và rất chậm, và tôi muốn sử dụng std :: vector nhanh hơn nhiều (tôi biết có một hàng đợi :: std, đây chỉ là một ví dụ). Nếu cách duy nhất để có được phần tử đầu tiên của một std :: vector là với v [0], tôi sẽ phải đi qua mã của tôi và thay thế tất cả các cuộc gọi của tôi để mặt trước() với [0]. Nhưng bằng cách thực hiện front(), std :: vector bây giờ có thể là một thay thế drop-in cho lớp xếp hàng của tôi. Mã duy nhất tôi phải thay đổi là loại vùng chứa trong thuật toán của tôi.

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