2013-07-06 3 views
5

vectorのサイズを返すgetterから返される値の型は?例えばvectorのサイズを返すgetterから返される値の型は?

私は次のタイプの私のプロジェクトに多くのゲッターを持っていると 私は、コンパイルの警告を削除するには(int)キャストを必要とする:

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

答えて

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 for threeway – Borgleader

+0

私はむしろこれらのいずれかではなく、私のint変換にとどまります:)。彼らは最後のものを除いてすべて醜いですが、まだそこにはありません、C++ 14 ... – user2381422

+3

@ user2381422、しかし 'int'はどこにでも問題を引き起こします。比較では、警告が表示され、切り捨てが発生する可能性があります。適切なタイプが必要な場合は、コールサイトで無駄な作業を行う必要があります。 – chris

5

あなたはstd::size_tを返す必要があります。 std::size_tは、デフォルトのアロケータを使用する場合の戻り値の型はvector<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::vectorvector::sizeの結果として使用されるタイプであるかを示しtypedefで、std::vector<>::size_type提供:

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です。

実際の答えは、建物内の建物の数を表すために使用しているプログラムの種類が既にあるかどうかによって異なります。 intunsigned、またはtypedef名TBuildingCountとすることができます。これは、この場合に使用するタイプです。コンパイラの警告を抑制するためにキャストが必要な場合がありますが、それは通常の方法です。

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

つまり、建物を数えるためにintを使用することを決定した場合は、問題の実装が固執する必要があります。

+0

私はこれに同意しますが、質問者がCスタイルのキャストに固執しているべきであるという最後の主張で、あまり言い表せません。 'static_cast'(特定の種類のコード検索を助けるため)や' boost :: numeric_cast'(現在の値が 'int'に収まらなければならない前提条件/クラス不変条件を宣言するための)のような選択肢があります)。 –

1

他の多くの回答とは対照的に、実際の関数の戻り値は実際にはあなたが使用しているものよりもはるかにインターフェイスに依存します。あなたはベクトルの大きさを戻して、誰もがそれを知りたがっていますか?さて、std::vector::size_typeを使用してください。しかし、実際には建物の数のようないくつかの抽象的な計算変数を返している、私はstd::vector::size_typeは、実装の詳細ですので、あなたのインターフェイスに属しているとは思わない。

それはあなたが返す(ただしneccessarilyフードの下のベクトルであることが知られていない)何かの大きさなら、私は古き良きstd::size_tを使用したいに、それは何かの数だ場合、unsigned intは、概念的にははるかにあります適切な。もちろん、またはstd::size_tは任意のstd::vectorのサイズを保持できますが、任意のstd::vectorではありません。建物の配列なので、とにかくstd::numeric_limits<unsigned int>::max()以上の建物があるかどうかを知る必要があります。

関連する問題