返回矢量大小的getter應該返回什麼類型的值?返回矢量大小的getter返回什麼類型的值?
例如,我有很多幹將在我以下類型的項目, 我需要(int)
投刪除編譯警告:
int getNumberOfBuildings() const { return (int)buildings.size(); }
返回矢量大小的getter應該返回什麼類型的值?返回矢量大小的getter返回什麼類型的值?
例如,我有很多幹將在我以下類型的項目, 我需要(int)
投刪除編譯警告:
int getNumberOfBuildings() const { return (int)buildings.size(); }
的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(); }
您應該返回std::size_t
。當您使用默認分配器時,std::size_t
是vector<T>::size()
的返回類型。 vector<T>::size()
返回vector<T>::size_type
當您使用默認分配器(您最有可能使用)時,這只是std::size_t
的typedef。
從技術上講,返回類型是'vector :: size_type',它是分配器的'size_type'的typedef,它又是'size_t'的typedef。如果你有一個自定義分配器,它可能會有所不同。 –
你們是什麼意思默認與自定義分配器? – user2381422
分配器是一個對象,它管理矢量如何獲取內存來存儲你放入的內容。您可以創建自己的自定義分配器,但在大多數情況下,缺省的分配器('std :: allocator')已經足夠好了。 – JKor
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(); }
然後在我的代碼中我也應該使用size_t正確嗎?例如:size_t temp = myObject.getNumberOfBuildings(); – user2381422
@ user2381422是的。如果你使用C++ 11,你可以使用'auto'關鍵字:'auto temp = myObject.getNumberOfBuildings();'。 – mfontanini
正式的答案確實是std::vector<Building>::size_type
,在其他的答案說。
真正的答案取決於您的程序中是否已有類型,用於表示建築物數量。它可能是int
,它可能是unsigned
或者它可能是某種typedef名稱TBuildingCount
。這是你應該在這種情況下使用的類型。它可能需要一個強制轉換來抑制編譯器警告,但這是通常的方式。
我沒有看到你的代碼的其餘部分,所以我不能肯定地說,但我猜測建築物存儲在某個向量(或任何其他容器)中的事實是隻是一個實施細節,不應該影響您選擇計算這些建築物的類型。即使以如使用其size_type
返回計數的間接方式,也不需要公開該遏制者的存在(或依賴它)。
換句話說,如果您已經決定使用int
來計算建築物,那麼您的問題中的實施是您應該堅持的。
我同意這一點,但我無法抗拒最後一個斷言,提問者「應該」堅持C風格演員。有些替代方法可能更可取,比如'static_cast'(用於幫助某些類型的代碼搜索)或'boost :: numeric_cast'(用於聲明當前值必須適合int的前提條件/類不變量) )。 –
與其他許多答案相比,函數的返回值實際上更多取決於您的界面,而不是您在底層使用的界面。你是否恢復了矢量的大小,並希望每個人都知道它?那麼,請繼續並使用std::vector::size_type
。但是實際上你是否返回了一些抽象計數變量,比如建築物數量,那麼我認爲std::vector::size_type
不屬於你的界面,因爲這只是一個實現細節。
如果它是你返回的東西的大小(但並不知道是引擎蓋下的一個向量),我會用舊的std::size_t
,但如果它是一些東西,那麼unsigned int
在概念上更重要適當。當然,任何人都不能保證unsigned int
或std::size_t
可以容納任意大小的std::vector
,但是它又不是任意的std::vector
,它是一組建築物,並且您自己應該知道是否總能有多於std::numeric_limits<unsigned int>::max()
的建築物。
+1三維解釋 – Borgleader
我寧願留在我的int轉換,而不是任何這些:)。他們都是醜陋的,除了最後一個,但我們還沒有,C++ 14 ... – user2381422
@ user2381422,但是'int'導致無處不在。在比較中,你會得到警告,你可能會截斷,如果你想要正確的類型,你必須在callsite上做毫無意義的工作。 – chris