5

「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;
}

Visual Studio2010のC++のベクターでテキストのように「.length()」を使用することはできませんでした。代わりに、std :: size_typeを返す.size()を使用する必要がありました。私が読んでいるように、さまざまなアーキテクチャでの問題を回避するためにsize_tを使用してそれを回避できると思いましたが、返すかどうか疑問に思っていますがi、整数よりも大きいので、プログラムをクラッシュさせますか?

[私の質問でより具体的に編集:]カードよりも大きなものにベクトルを使用し始めたら、コンパイラの不一致の警告のためにunsigned intの使用を検討しましたが、unsigned intまたはintを返すにはいくつかの問題があると感じます:1) intは十分に大きなベクトルインデックスを取りません。2)unsigned intを返すと、-1は返されません。3)unsigned intは、すべてのアーキテクチャでsize_tと同じではありません(ARM Cortex-M3でマイクロコントローラープログラミングも行っています)。

十分な大きさのベクトルがある場合はどうすればよいですか?

4

4 に答える 4

3

size_tからにキャストしてintもプログラムが「クラッシュ」することはありませんが、これは悪い習慣です。一方、STLには、find実行していることに対する優れたアルゴリズムが含まれています。

于 2010-12-16T04:34:36.693 に答える
2

intは、32/64ビットのWindowsおよびLinuxでは32ビットです。31日に2を超えると、切り捨てられます。unsigned intを使用でき、ベクトルに4つ以上のG要素を格納しない限り、プログラムは問題ありません:)

于 2010-12-16T04:37:02.887 に答える
0

size_t通常はですが、unsigned intそれに頼ることはできません。クラッシュしないよりも大きい場合はint、(おそらく負の)数値にオーバーフローします。

1つのベクトルに数万枚のカードが含まれないと仮定すると、を返すことができれば幸いintです。

于 2010-12-16T04:33:59.580 に答える
0

std::pair<size_t, bool>と同様に、を返すこともできますstd::map insert()。2番目のテンプレート引数は、成功または失敗を意味します。

これでよければ、boost::optionalを使用することもできます

于 2010-12-16T05:22:58.440 に答える