競技プログラミング用 知識集積所

size_t型

最終更新:

sport_programming

- view
管理者のみ編集可


雑な説明

vector(未作成)string型(未作成)などの添え字やデータサイズを扱うときに使う整数型変数。

レベル

ABCのA問題レベル。

詳細な説明

符号なしの整数型。
何ビットかであるかは環境によるが、AtCoderでは64ビット。
現代ならほとんどの環境で64ビットであると思われる。

64ビットの場合、扱える値の範囲は0から18,446,744,073,709,551,615まで。
これより大きいサイズのデータを扱うことはないので、上限超えは心配しなくていい。
むしろ、意図せず0より小さい数を扱ってしまう不具合が出がちなので注意。

宣言と初期化

宣言だけする場合
size_t a;
初期化もする場合
size_t a = 0;  //固定値で初期化
size_t b = a;  //他の変数(整数型、double型)で初期化

可能な演算

int型とほぼ同じなので、そちらを参照。
ただし、減算は小さい方から大きい方を引くと正しい結果にならない点に注意。

よく使う処理

vector(未作成)string型(未作成)の中身全ループ

大きさが変数で与えられていない場合、ループを普通に書くと
for (int i=0; i<vec.size(); i++)
としたくなる。
ところが、size()の返り値はsize_t型なので、int型とsize_t型の比較を行っているというwarningが出てしまう。
for (size_t i=0; i<vec.size(); i++)
と書くことでwarningを防ぐことができる。
もっとも、warningが出るけど無視してもいいし、ループ前にsize()の値をint型変数に入れて使用してもよい。

注意点

「18中略615」番目へのアクセスが発生した場合のデバッグ。

vector(未作成)string型(未作成)の中の1つにアクセスするとき、このiはsize_t型として扱われる。
つまり、もし想定外の挙動でiが-1だった場合は、size_t型に変換されたときに18,446,744,073,709,551,615として扱われてることになる。
配列の範囲外アクセスのエラーメッセージにこの「18中略615」を見かけたら、-1番目へのアクセスをしようとした可能性が高いことを覚えておくとよい。

逆順ループをする場合のループ条件に注意。

問題の内容次第では
for (int i=n-1; i>=0; i--)
という逆順ループを書きたい場合がある。
int型であれば何も問題ないが、このiがsize_t型の場合、i=0の次がi=18,446,744,073,709,551,615になってループ継続してしまう。
for (size_t i=a.size()-1; i<a.size(); i--)
のように書くと防げる。

関連アルゴリズム

ウィキ募集バナー