2013-07-06 117 views

回答

25

的C++ 03方式:

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

的C++ 11路:

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

的C++ 14路:

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

+1三維解釋 – Borgleader

+0

我寧願留在我的int轉換,而不是任何這些:)。他們都是醜陋的,除了最後一個,但我們還沒有,C++ 14 ... – user2381422

+3

@ user2381422,但是'int'導致無處不在。在比較中,你會得到警告,你可能會截斷,如果你想要正確的類型,你必須在callsite上做毫無意義的工作。 – chris

5

您應該返回std::size_t。當您使用默認分配器時,std::size_tvector<T>::size()的返回類型。 vector<T>::size()返回vector<T>::size_type當您使用默認分配器(您最有可能使用)時,這只是std::size_t的typedef。

+4

從技術上講,返回類型是'vector :: size_type',它是分配器的'size_type'的typedef,它又是'size_t'的typedef。如果你有一個自定義分配器,它可能會有所不同。 –

+0

你們是什麼意思默認與自定義分配器? – user2381422

+1

分配器是一個對象,它管理矢量如何獲取內存來存儲你放入的內容。您可以創建自己的自定義分配器,但在大多數情況下,缺省的分配器('std :: allocator')已經足夠好了。 – JKor

3

std::vector提供一個typedef,std::vector<>::size_type,表示這是用作vector::size結果類型:

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

然而,這通常是size_t,所以你可以繼續直接使用後者:

#include <cstddef> 

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

然後在我的代碼中我也應該使用size_t正確嗎?例如:size_t temp = myObject.getNumberOfBuildings(); – user2381422

+1

@ user2381422是的。如果你使用C++ 11,你可以使用'auto'關鍵字:'auto temp = myObject.getNumberOfBuildings();'。 – mfontanini

3

正式的答案確實是std::vector<Building>::size_type,在其他的答案說。

真正的答案取決於您的程序中是否已有類型,用於表示建築物數量。它可能是int,它可能是unsigned或者它可能是某種typedef名稱TBuildingCount。這是你應該在這種情況下使用的類型。它可能需要一個強制轉換來抑制編譯器警告,但這是通常的方式。

我沒有看到你的代碼的其餘部分,所以我不能肯定地說,但我猜測建築物存儲在某個向量(或任何其他容器)中的事實是隻是一個實施細節,不應該影響您選擇計算這些建築物的類型。即使以如使用其size_type返回計數的間接方式,也不需要公開該遏制者的存在(或依賴它)。

換句話說,如果您已經決定使用int來計算建築物,那麼您的問題中的實施是您應該堅持的。

+0

我同意這一點,但我無法抗拒最後一個斷言,提問者「應該」堅持C風格演員。有些替代方法可能更可取,比如'static_cast'(用於幫助某些類型的代碼搜索)或'boost :: numeric_cast'(用於聲明當前值必須適合int的前提條件/類不變量) )。 –

1

與其他許多答案相比,函數的返回值實際上更多取決於您的界面,而不是您在底層使用的界面。你是否恢復了矢量的大小,並希望每個人都知道它?那麼,請繼續並使用std::vector::size_type。但是實際上你是否返回了一些抽象計數變量,比如建築物數量,那麼我認爲std::vector::size_type不屬於你的界面,因爲這只是一個實現細節。

如果它是你返回的東西的大小(但並不知道是引擎蓋下的一個向量),我會用舊的std::size_t,但如果它是一些東西,那麼unsigned int在概念上更重要適當。當然,任何人都不能保證unsigned intstd::size_t可以容納任意大小的std::vector,但是它又不是任意的std::vector,它是一組建築物,並且您自己應該知道是否總能有多於std::numeric_limits<unsigned int>::max()的建築物。