vectorのサイズを返すgetterから返される値の型は?例えばvectorのサイズを返すgetterから返される値の型は?
私は次のタイプの私のプロジェクトに多くのゲッターを持っていると 私は、コンパイルの警告を削除するには(int)
キャストを必要とする:
int getNumberOfBuildings() const { return (int)buildings.size(); }
vectorのサイズを返すgetterから返される値の型は?例えばvectorのサイズを返す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
がvector::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(); }
そして、私のコードでは、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
は、実装の詳細ですので、あなたのインターフェイスに属しているとは思わない。
それはあなたが返す(ただしneccessarilyフードの下のベクトルであることが知られていない)何かの大きさなら、私は古き良きstd::size_t
を使用したいに、それは何かの数だ場合、unsigned int
は、概念的にははるかにあります適切な。もちろん、またはstd::size_t
は任意のstd::vector
のサイズを保持できますが、任意のstd::vector
ではありません。建物の配列なので、とにかくstd::numeric_limits<unsigned int>::max()
以上の建物があるかどうかを知る必要があります。
+1 for threeway – Borgleader
私はむしろこれらのいずれかではなく、私のint変換にとどまります:)。彼らは最後のものを除いてすべて醜いですが、まだそこにはありません、C++ 14 ... – user2381422
@ user2381422、しかし 'int'はどこにでも問題を引き起こします。比較では、警告が表示され、切り捨てが発生する可能性があります。適切なタイプが必要な場合は、コールサイトで無駄な作業を行う必要があります。 – chris