5

ベクトルのサイズを返すゲッターは、どのような値を返す必要がありますか?

たとえば、プロジェクトに次のタイプのゲッターが多数あり(int)、コンパイル警告を削除するにはキャストが必要です。

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

5 に答える 5

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(); }
于 2013-07-06T20:40:07.603 に答える
5

を返す必要がありstd::size_tます。 デフォルトのアロケータを使用した場合 std::size_tの戻り値の型です。これは、デフォルトのアロケーター(おそらく使用している可能性が高い) を使用する場合の単なる typedef です。vector<T>::size()vector<T>::size()vector<T>::size_typestd::size_t

于 2013-07-06T20:39:00.393 に答える
3

std::vector<Building>::size_type他の回答で述べたように、正式な回答は確かにです。

実際の答えは、建物の数を表すために使用する型がプログラムに既にあるかどうかによって異なります。それはint、あるかもしれませんし、あるかもしれませんし、unsigned何らかの typedef 名かもしれませんTBuildingCount。この場合は、このタイプを使用する必要があります。コンパイラの警告を抑制するためにキャストが必要になる場合がありますが、通常はそうです。

あなたのコードの残りの部分が見えないので、はっきりとは言えませんが、建物がどこかのベクトル (または他のコンテナー) に格納されているという事実は、実装の詳細にすぎないと思います。 、これらの建物を数えるためのタイプの選択に影響を与えるべきではありません。size_typeそのコンテナーを使用してカウントを返すような間接的な方法であっても、そのコンテナーの存在を公開する (またはそれに依存する) 必要はありません。

つまり、int建物のカウントに使用することをすでに決定している場合は、質問の実装に固執する必要があります。

于 2013-07-06T21:34:02.310 に答える
3

std::vectorstd::vector<>::size_typeの結果として使用される型を示すtypedef を提供しますvector::size

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

ただし、これは通常はsize_tであるため、先に進んで後者を直接使用できます。

#include <cstddef>

std::size_t getNumberOfBuildings() const { return buildings.size(); }
于 2013-07-06T20:39:46.053 に答える