0

ベクトルがあり、最大10個のオブジェクトを保持できます。ベクトルを作成すると、それが保持するクラスの10個の「空白」オブジェクトが作成されると思います。したがって、私のコードはベクトル要素がnullであることを確認することに依存しており、明らかにnullになることはないため、問題が発生します。

ベクトルオブジェクトに挿入した要素が含まれているかどうか、または初期化時にデフォルトのコンストラクターの「空白」オブジェクトの1つが含まれているかどうかを確認するにはどうすればよいですか?

これを回避するテクニックはありますか?

(再帰アルゴリズムと終了ポイントを記述しているため、nullをチェックする必要があります。再帰関数が返されるのは、ベクトル内のオブジェクトがnullの場合です)

4

3 に答える 3

1

クラスのインスタンスをnullにすることはできません。ポインタのみ。

ただし、使用できるsize()はあります。

typedef stdd::vector<SomeClass> vec;
//define some vec, v
for (vec::size_type i = 0, s = vec.size(); i < s; ++i) {
    //do something with v[i]
}

再帰関数を使用すると、最大インデックスを渡すことでこのアイデアを使用できます。

void recursiveFunc(vec& v, vec::size_type s);

次に、再帰する条件をチェックするときは、「私はベクトルの最後にいますか?」をチェックする必要があります。

または、インデックスで作業する代わりに、イテレータを使用できます。

template <typename Iterator>
void recursiveFunc(Iterator begin, const Iterator& end);

正しく行われた場合(そして可能であればあなたの状況で)、これはあなたの操作をベクトルに格納されている基礎となるデータの認識から切り離す可能性があります。

ベクトルを通過するループは次のようになります。

while (begin != end) {
    //do something with *begin
    ++begin;
}
于 2012-05-27T00:49:38.297 に答える
1

std::vector「実際の」オブジェクトのみを挿入します。(少なくとも通常は)rawメモリを割り当て、必要に応じて新しい配置を使用してそのメモリにオブジェクトを構築します。そこに含まれる唯一のオブジェクトは、そこに置いたものになります。

もちろん、必要に応じて、コンストラクターに渡すオブジェクトのコピーの数を含むベクトルを作成できます。同様にresize、ベクターを作成する場合、オブジェクトを大きくする場合は、オブジェクトを新しい場所にコピーして渡します。

しかし、どちらも実際には標準ではありません。通常の場合、を作成するだけでvector、最初は0個のオブジェクトが含まれます。push_backにオブジェクトを追加するために使用しますvector。を検索するとvector、そこに配置したオブジェクトだけが存在しpush_back、他のオブジェクトが含まれている可能性について心配する必要はありません。

が空かどうかを確認したいだけの場合vectorは、次を使用できます。

if (your_vector.empty())

...これはtrue、空の場合、およびfalse少なくとも1つのオブジェクトが含まれている場合に(明らかに十分に)返されます。

于 2012-05-27T01:12:47.553 に答える
0

@Corbinが述べたように、size()はベクトル内の要素の数を返します。間に(連続した)穴がないことが保証されているため、vector [vector.size()]は空であることが保証されます。

于 2012-05-27T00:51:30.697 に答える