質問

「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_tint あなたのプログラムを「クラッシュ」しませんが、それは悪い練習です。一方、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番目のテンプレート引数は、成功または失敗を意味します。

これで大丈夫なら、あなたも使用することができます ブースト::オプション

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top