誰かがここで何が起こっているのかを英語で説明できますか?
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);
}
誰かがここで何が起こっているのかを英語で説明できますか?
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);
}
@mlimberはすでに1つの説明をしています。
少し違った説明をします。平易な英語では、それは本当に単純なものを取る方法です:
std::set<Cat> cats;
cats.insert(morris);
速度が遅くなり(対数ではなく線形)、読みにくく、理解しにくくなります。
編集:公平を期すために、私はあなたがこのようなことをしたいと思うかもしれないいくつかの理由があることを付け加えるべきだと思います。たとえば、コレクションにsが追加された順序を本当に知る必要がある場合は、元の順序を保持することには意味があります。同様に、通常、コレクションがメモリ内で連続しているという利点がある方法でコレクションを使用していて、新しいアイテムを追加することはめったにない場合は、データをに保存する方が理にかなっている場合があります。Cat
vector
set
ただし、 Aは、ここで行われていることを正確set
に実行するように設計されているため、当然の選択です(これまでに示したものには表示されない、を使用するやむを得ない理由はありません)。set
vector
ベクターにまだアイテムがない場合はmorris
、ベクターに呼び出されるアイテムを追加します。cats
はstd::find
、アイテムmorris
がベクター内にあるかどうかを確認するために使用されcats
ます。ありません。std::find
戻り値はに等しくなりcats.end()
ます。この後、他のすべてはかなり簡単です。
コードが正しいと仮定すると(morrisのタイプと初期化、比較のためのポインターの使用など)、重要なのは、morrisが猫のコレクションに含まれているかどうかを確認し、含まれていない場合は追加することです。
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)をベクトルに入れます。
最初に注意してください:あなたのコメントは間違っています。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まだ猫のベクトルには入っていません、最後に置いてください」
何があなたを悩ませているのか正確にわからない場合、私はより具体的にするのに苦労するでしょう
std::vector<Cat*> cats; //I get that cats is a vector of Cat objects
あなたはそれを間違えます。cats
クラスへstd::vector
のポインタのCat
です。違いがあります:Cat
sはスタック上にあり、次のようにして作成されます
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
します。