C++コンテナでint
ではなくsize_type
を返すのはなぜですか?独自の構造を作成する場合、size_type
を使用することも推奨されますか?
一般に、何かのサイズを測定するときは常に_size_t
_を使用する必要があります。 _size_t
_が0〜_SIZE_MAX
_バイトを表すためにのみ必要であり、_SIZE_MAX
_が65,535のみを必要とすることは本当に奇妙です...
C++およびC標準からの他の興味深い制約は次のとおりです。
sizeof()
の戻り値の型は_size_t
_であり、それは符号なし整数です。operator new()
は、割り当てるバイト数を_size_t
_パラメータとして受け取りますsize_t
_は_<cstddef>
_で定義されていますSIZE_MAX
_はC99の_<limits.h>
_で定義されていますが、C++ 98では言及されていません!size_t
_は基本整数型のリストに含まれていないため、_size_t
_は基本型の1つに対する型エイリアスであると常に想定しています:char
、_short int
_、int
、および_long int
_。バイトをカウントしている場合は、必ず_size_t
_を使用する必要があります。要素の数を数える場合、C++が使用しているように見えるので、おそらく_size_t
_を使用する必要があります。いずれの場合でも、int
は使用しないでください。TR1を使用している場合は、少なくとも_unsigned long
_または_unsigned long long
_を使用してください。または...さらに良い... typedef
_size_type
_に使用するものは何でも、または_<cstddef>
_を含めて_std::size_t
_を使用するだけでもかまいません。
いくつかの理由が考えられます。
自分だけのアプリや使い捨てのアプリを作成しているのであれば、おそらく基本的なintを使用するのが良いでしょう。ライブラリなどの実質的なものを作成している場合は、おそらくsize_tがより良い方法です。
一部の回答は必要以上に複雑です。 size_tは、メモリ内のオブジェクトのサイズをバイト単位で格納するのに十分な大きさであることが保証されている符号なし整数型です。実際には、常にポインタ型と同じサイズです。 32ビットシステムでは、32ビットです。 64ビットシステムでは、64ビットです。
Stlのすべてのコンテナには、さまざまなtypedefがあります。たとえば、value_type
は要素のタイプであり、size_type
は格納されている数値のタイプです。このように、コンテナはプラットフォームと実装に基づいて完全に汎用的です。
独自のコンテナを作成する場合は、size_type
も使用する必要があります。通常、これは行われます
typedef std::size_t size_type;
コンテナーのサイズが必要な場合は、
typedef vector<int> ints;
ints v;
v.Push_back(4);
ints::size_type s = v.size();
いいのは、後でリストを使用したい場合は、typedefを次のように変更するだけです。
typedef list<int> ints;
そしてそれはまだ働きます!
C++は、さまざまなハードウェアアーキテクチャおよびプラットフォームに実装できる言語です。時が経つにつれ、16ビット、32ビット、64ビットのアーキテクチャがサポートされ、将来的には他のアーキテクチャもサポートされる可能性があります。 size_type
およびその他の型エイリアスは、ライブラリ/プログラマー/コードを実装の詳細から隔離する方法です。
size_type
が32ビットマシンで32ビットを使用し、64ビットマシンで64ビットを使用すると仮定すると、必要に応じてsize_typeを使用している場合は、同じソースコードがより適切に機能します。ほとんどの場合、これはunsigned int
と同じであると想定できますが、保証されていません。
size_type
は std::vector
のようにSTLコンテナの容量を表すために使用されますが、size_t
はCでオブジェクトのバイトサイズを表すために使用されます/ C++。
私はあなたが「size_t」を意味していると思います-これは、符号なし整数(正の値のみで、負の値にはならない整数)を示す方法です-サイズのある配列を持つことができないため、コンテナーのサイズに意味がありますの-7。 size_tを使用する必要があるとは言いませんが、「この数値は常に正数です」というコードを使用している他の人にそれを示しています。また、正の数の範囲が広がりますが、非常に大きなコンテナがない限り、それは重要ではない可能性があります。
_size_t
_は符号なしなので、どちらも32ビットであっても、修飾されていないintとまったく同じことを意味するわけではありません。彼らが型を追加した理由はわかりませんが、今日の多くのプラットフォームではsizeof (size_t) == sizeof (int) == sizeof (long)
なので、どの型を選択するかはあなた次第です。これらの関係は規格によって保証されておらず、64ビットプラットフォームが導入されるにつれて急速に古くなっていることに注意してください。
独自のコードの場合、「サイズ」を概念的に表現する必要があり、負になることは決してない場合は、_size_t
_が最適です。
仕様では、intは4バイトであることが保証されていないため、信頼性はありません。はい、size_typeはintよりも優先されます