2013-07-06 30 views

Trả lời

25

C++ 03 cách:

std::vector<Building>::size_type getNumberOfBuildings() const 
{ return buildings.size(); } 

C++ 11 cách:

auto getNumberOfBuildings() const -> decltype(buildings.size()) 
{ return buildings.size(); } 

C++ 14 cách:

auto getNumberOfBuildings() const 
{ return buildings.size(); } 
+4

+1 cho giải thích ba chiều – Borgleader

+0

Tôi thà ở lại với chuyển đổi int của tôi hơn là bất kỳ trong số này :). Tất cả đều xấu xí ngoại trừ cái cuối cùng nhưng chúng ta chưa có, C++ 14 ... – user2381422

+3

@ user2381422, Nhưng 'int' gây rắc rối ở khắp mọi nơi. Trong so sánh, bạn nhận được cảnh báo, bạn có thể nhận được cắt ngắn, và bạn phải làm công việc vô nghĩa trong các callite nếu bạn muốn loại thích hợp. – chris

5

Bạn nên trả lại một std::size_t. std::size_t là kiểu trả về của vector<T>::size() khi bạn sử dụng trình phân bổ mặc định. vector<T>::size() trả về vector<T>::size_type mà chỉ là một typedef cho std::size_t khi bạn sử dụng trình phân bổ mặc định (bạn có nhiều khả năng sử dụng).

+4

Về mặt kỹ thuật, kiểu trả về là 'vector :: size_type', là một typedef cho' size_type' của người cấp phát, mà lần lượt là một typedef cho 'size_t'. Nếu bạn có một phân bổ tùy chỉnh, nó có thể là một cái gì đó khác nhau. –

+0

Ý của bạn là gì theo mặc định so với phân bổ tùy chỉnh? – user2381422

+1

Một bộ cấp phát là một đối tượng quản lý cách mà vectơ nhận được bộ nhớ để lưu trữ những gì bạn đặt vào nó. Bạn có thể tạo các trình phân bổ tùy chỉnh của riêng mình, nhưng một cái mặc định ('std :: allocator') là đủ tốt trong hầu hết các trường hợp. – JKor

3

std::vector cung cấp một typedef, std::vector<>::size_type, cho biết đó là loại được sử dụng như là kết quả của vector::size:

std::vector<TYPE>::size_type getNumberOfBuildings() const { return buildings.size(); } 

này, tuy nhiên, thường là size_t, vì vậy bạn có thể đi trước và sử dụng sau này trực tiếp:

#include <cstddef> 

std::size_t getNumberOfBuildings() const { return buildings.size(); } 
+0

và sau đó trong mã của tôi, tôi cũng nên sử dụng size_t chính xác? ví dụ: size_t temp = myObject.getNumberOfBuildings(); – user2381422

+1

@ user2381422 yes. Nếu bạn đang sử dụng C++ 11, bạn có thể sử dụng từ khóa 'auto':' auto temp = myObject.getNumberOfBuildings(); '. – mfontanini

3

Câu trả lời chính thức thực sự là std::vector<Building>::size_type, như đã nêu trong câu trả lời khác.

Câu trả lời thực sự tùy thuộc vào việc bạn đã có loại trong chương trình mà bạn sử dụng để biểu thị số lượng tòa nhà. Nó có thể là int, có thể là unsigned hoặc có thể là một số tên typedef TBuildingCount. Đây là loại bạn nên sử dụng trong trường hợp này. Nó có thể yêu cầu một diễn viên để ngăn chặn cảnh báo trình biên dịch, nhưng đó là cách nó thường là.

Tôi không thấy phần còn lại của mã, vì vậy tôi không thể chắc chắn, nhưng tôi đoán rằng các tòa nhà được lưu trữ trong một số vector ở đâu đó (hoặc trong bất kỳ vùng chứa nào khác) chỉ là chi tiết triển khai, không ảnh hưởng đến lựa chọn loại của bạn để tính các tòa nhà này. Không cần phải phơi bày sự tồn tại của bộ lọc đó (hoặc dựa vào nó) ngay cả theo cách gián tiếp như sử dụng size_type để trả về số đếm.

Nói cách khác, nếu bạn đã quyết định sử dụng int để đếm tòa nhà, thì việc triển khai trong câu hỏi của bạn là câu hỏi bạn nên tuân thủ.

+0

Tôi đồng ý với điều này, nhưng tôi không thể cưỡng lại việc quibbling với xác nhận cuối cùng rằng người hỏi "nên" gắn bó với một dàn diễn viên kiểu C. Có các lựa chọn thay thế có thể thích hợp hơn, chẳng hạn như 'static_cast' (để hỗ trợ một số loại tìm kiếm mã) hoặc' boost :: numeric_cast' (để xác nhận điều kiện tiên quyết/lớp bất biến mà giá trị hiện tại phải phù hợp với 'int'). –

1

Ngược lại với nhiều câu trả lời khác, giá trị trả lại của hàm của bạn thực sự phụ thuộc nhiều hơn vào giao diện của bạn so với những gì bạn sử dụng dưới mui xe. Bạn đang quay trở lại kích thước của một vector và muốn mọi người biết nó? Vâng, sau đó tiếp tục và sử dụng std::vector::size_type. Nhưng bạn có thực sự trả về một số biến đếm trừu tượng, giống như số lượng tòa nhà, sau đó tôi không nghĩ rằng std::vector::size_type thuộc về giao diện của bạn, vì đó chỉ là chi tiết triển khai.

Nếu đó là kích thước của thứ gì đó mà bạn quay trở lại (nhưng không được biết đến là véc tơ dưới mui xe), tôi sẽ sử dụng cũ std::size_t, nhưng nếu nó là một thứ gì đó thì unsigned int thích hợp. Tất nhiên không ai đảm bảo rằng unsigned int hoặc std::size_t có thể giữ kích thước tùy ý std::vector, nhưng sau đó lại không phải là tùy ý std::vector, đó là một loạt các tòa nhà và chính bạn nên biết nếu có thể có hơn std::numeric_limits<unsigned int>::max() tòa nhà.

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