0

と の 2 つのタイプがあるClass1としClass2ます。次に、2 つのベクトルを作成します。

vector<Class1> vec1;
vector<Class2> vec2;
//create vec1 and vec2, such that both have the same number of elements
for (vector<Class1>::size_type i=0; i!=vec1.size(); ++i) {
  c1 = vec1[i];
  c2 = vec2[i]; //BAD?
  //do something
}

あなたはおそらく絵を手に入れます。size_typeこの場合、 forvector<Class2>が for と同じであることに依存するのは悪いことではありませんvector<Class1>か?

これらの場合、異なるタイプのオブジェクトを含む 2 つの同じサイズのベクトルがあるにもかかわらず、それらの両方をループすることを保証するのに十分な関連性がある場合、この問題をどのように解決できますか?

問題が発生するほど大きな整数に到達する可能性は低いことはわかっていますが、それでも、優れた堅牢な C++ コードを書きたいと思っています。多分私は両方を見てsize_type、それらの最小を取るべきですか?それは行く方法ですか?私には奇妙な習慣のように聞こえます。

4

3 に答える 3

2

これが標準で保証されているかどうかはわかりませんが、vector::size_typeどのテンプレートパラメータを選択しても、すべてのタイプが同一であると思います。

于 2012-12-05T19:36:06.840 に答える
2

はとしてstd::allocator定義されているため、 の異なる型を定義するカスタム アロケータが存在しないことを保証できる場合は、 as iと仮定できます。size_typesize_tsize_typesize_t size_type

ただし、誰かが後で戻ってきて、この仮定と互換性がない可能性のあるカスタム アロケーターを追加するリスクがあります。

于 2012-12-05T19:53:11.803 に答える
1

少なくとも理論的には、ここで必要なのは次のようなものだと思います。

std::common_type<std::vector<classA>::size_type, 
                 std::vector<classB>::size_type>::type i;

for (i=0; i!=vec1.size(); i++)
    // ...

ただし、ほとんどのコードで定期的にそれが見られるとは思えません (また、おそらく、それを書いたことでクリスマス パーティーの乾杯になることもありません)。

于 2012-12-05T19:29:49.007 に答える