0

誰かがここで何が起こっているのかを英語で説明できますか?

std::vector<Cat*> cats; //I get that cats is a vector of Cat objects

if (std::find(cats.begin(), cats.end(), morris) == cats.end()) {
   cats.push_back(morris);
}
4

6 に答える 6

5

@mlimberはすでに1つの説明をしています。

少し違った説明をします。平易な英語では、それは本当に単純なものを取る方法です:

 std::set<Cat> cats;

 cats.insert(morris);

速度が遅くなり(対数ではなく線形)、読みにくく、理解しにくくなります。

編集:公平を期すために、私はあなたがこのようなことをしたいと思うかもしれないいくつかの理由あることを付け加えるべきだと思います。たとえば、コレクションにsが追加された順序を本当に知る必要がある場合は、元の順序を保持することには意味があります。同様に、通常、コレクションがメモリ内で連続しているという利点がある方法でコレクションを使用していて、新しいアイテムを追加することはめったにない場合は、データをに保存する方が理にかなっている場合があります。Catvectorset

ただし、 Aは、ここで行われていることを正確setに実行するように設計されているため、当然の選択です(これまでに示したものには表示されない、を使用するやむを得ない理由はありません)。setvector

于 2011-03-03T19:20:06.110 に答える
2

ベクターにまだアイテムがない場合はmorris、ベクターに呼び出されるアイテムを追加します。cats

std::find、アイテムmorrisがベクター内にあるかどうかを確認するために使用されcatsます。ありません。std::find戻り値はに等しくなりcats.end()ます。この後、他のすべてはかなり簡単です。

于 2011-03-03T19:18:40.717 に答える
1

コードが正しいと仮定すると(morrisのタイプと初期化、比較のためのポインターの使用など)、重要なのは、morrisが猫のコレクションに含まれているかどうかを確認し、含まれていない場合は追加することです。

于 2011-03-03T19:16:35.553 に答える
1

catsは、Catオブジェクトへのポインターのベクトルであり、Catオブジェクトのベクトルではありません。

これにより、cats(cats.begin()からcats.end()まで)の全範囲で、morrisに等しいオブジェクト(猫へのポインター)が検索されます。

std::find(cats.begin(), cats.end(), morris)

戻り値は、オブジェクトが見つかった場合はオブジェクトを指すベクトルへのイテレーターであり、見つからなかった場合は終了イテレーター(cats.end())を返します。それを念頭に置いて、これは:

if (std::find(cats.begin(), cats.end(), morris) == cats.end())

猫にそのオブジェクト(モリス)が含まれているかどうかを確認するためのテストです。そうでない場合は、次のように実行します。

cats.push_back(morris);

オブジェクト(morris)をベクトルに入れます。

于 2011-03-03T19:20:07.517 に答える
1

最初に注意してください:あなたのコメントは間違っています。catsはCatオブジェクトのベクトルではなく、catオブジェクトへのポインターのベクトルです。

さて、ステートメント:

std :: find(cats.begin()、cats.end()、morris)

どこかにモリスと呼ばれる猫*がいることを意味します。このステートメントは、提供された2つのイテレーター(つまり、cats.begin()とcats.end())の間で、morris(同じアドレス)に等しいCatへのポインターのベクトルを検索します。何も見つからない場合、std :: findは2番目のイテレータを返すため、この場合は「cats.end()」

したがって、「if(std :: find(cats.begin()、cats.end()、morris)== cats.end()){cats.push_back(morris);}」は、平易な英語で「if morris isnまだ猫のベクトルには入っていません、最後に置いてください」

何があなたを悩ませているのか正確にわからない場合、私はより具体的にするのに苦労するでしょう

于 2011-03-03T19:22:37.910 に答える
0
std::vector<Cat*> cats; //I get that cats is a vector of Cat objects

あなたはそれを間違えます。catsクラスへstd::vectorのポインタのCatです。違いがあります:Catsはスタック上にあり、次のようにして作成されます

Cat morris;

削除する必要はありません。あなたの例のようなポインタは、によって作成されます

Cat* morris = new Cat();

ポインタを捨てる前に、それが終わったら削除する必要があります。

delete morris;

ここで、例に小さなコードを追加します。

Cat* morris = new Cat();

if (std::find(cats.begin(), cats.end(), morris) == cats.end()) {
   cats.push_back(morris);
}

これにより、ヒープ上に動的に割り当てられたmorrisタイプのオブジェクトが作成されます。Cat次に、を使用して、新しく作成されたオブジェクトstd::findのベクトルを検索します。このオブジェクトは、このコードフラグメントでは常に失敗します。cats失敗した場合std::findは、コンテナ内の最後の要素を1つ超えた要素にイテレータを返します(これが正確にstd::vector::end()返されます)。したがって、morrisが見つからない場合、コードはベクトルの後ろに新しい要素を作成し、それに追加morrisします。

于 2011-03-03T19:23:15.383 に答える