size_tと比較して、intを返しますか?
質問
「C ++のコンピューター科学者のように考える方法」のコード例をいくつか書いています。これは、プレイカードタイプのオブジェクトとデッキの処理に関するものです。私はこの状況に直面しています:
int Card::find(const std::vector<Card>& deck) const {
size_t deckSize = deck.size();
for (size_t i=0; i<deckSize; i++)
if (equals(*this, deck[i])) return i;
return -1;
}
TextのようにVisual Studio 2010のC ++のベクトルで「.length()」を使用できませんでした。読んでいるように、さまざまなアーキテクチャの問題を避けるためにsize_tを使用して逃げることができると思いましたが、戻ってくるかどうか疑問に思います i
, 、しかし、それは整数よりも大きいです、私はプログラムをクラッシュさせますか?
私の質問でより具体的に編集された:]カードよりも大きなものにベクトルの使用を開始したら、コンパイラの不一致の警告のために符号なしのINTを使用することを検討しましたが、署名されていないINTまたはINTを返すことにはいくつかの問題があります:1) INTは十分に大きなベクトルインデックスを取得しません。 2)署名されていないINTを返すことは、私に戻ることができません-1。 3)符号なしのINTは、すべてのアーキテクチャのSIZE_Tに等しくありません(ARM Cortex-M3でマイクロコントローラープログラミングも行っています)。
十分な大きさのベクトルがある場合はどうすればよいですか?
解決
からのキャスティング size_t
に int
あなたのプログラムを「クラッシュ」しませんが、それは悪い練習です。一方、STLにはニースが含まれています find
あなたがしていることのためのアルゴリズム。
他のヒント
INTは、32 /64ビットウィンドウとLinuxで32ビットです。 31日に2人以上である場合、切り捨てられます。 Unsigned Intを使用すると、ベクトルに4 Gを超える要素を保存しない限り、プログラムは問題ありません:)
size_t
通常、です unsigned int
しかし、あなたはそれに頼ることはできません。それがより大きい場合 int
クラッシュすることはありません。(おそらくマイナス)数に溢れます。
1つのベクトルに数万枚のカードを数万個持っていないと仮定すると、私は戻ってきて幸せです int
.
返すこともできます std::pair<size_t, bool>
, 、 に似ている std::map insert()
. 。 2番目のテンプレート引数は、成功または失敗を意味します。
これで大丈夫なら、あなたも使用することができます ブースト::オプション