重複の可能性:
ベクトルの要素を一意にする方法は?(隣接していない重複
を削除します)リストから重複を削除します<int>
私は次のようなポインタのリストを持っています
std::list<Person*> persons;
記入中にこのリストに重複があります。重複を削除し、一意のポインタのみをリストに残すにはどうすればよいですか?
重複の可能性:
ベクトルの要素を一意にする方法は?(隣接していない重複
を削除します)リストから重複を削除します<int>
私は次のようなポインタのリストを持っています
std::list<Person*> persons;
記入中にこのリストに重複があります。重複を削除し、一意のポインタのみをリストに残すにはどうすればよいですか?
要素の順序を変更できる場合は、最初にlist::sortでリストを並べ替え、次にlist::uniqueで重複を削除します。
std::less<Person*> cmp;
persons.sort(cmp);
persons.unique(cmp);
一方、std::setを使用できます。その要素は一意で順序付けられており、要素がセットに既に存在する場合、挿入メソッドは失敗します。
単一の要素を挿入する時間の複雑さは対数的であるのに対し、リストの前後に要素を追加する時間は一定であることに注意してください。一方、std::list::sort
はN*log(N)
、std::unique
は線形です。したがって、これらの重複除去を頻繁に実行する場合はstd::set
、最初に を使用することをお勧めします。また、C++11 にはstd::unordered_setがあり、要素の一意性と、挿入と削除の複雑さが平均的に一定であることにも注意してください。
挿入順序を気にしない場合は、 a のset
代わりに a を使用しlist
ます。その中には一意の要素のみを含めることができ、他の人が推奨する並べ替えを自動的に行います。
挿入順序が気になる場合は、次のようにします。
auto i = std::find(persons.begin(), persons.end(), pPerson);
if(i != persons.end())
persons.erase(i);
persons.insert(pPerson);
(私はそれをコンパイルしませんでした)
指しているアドレスに従ってリストを並べ替えます。単純なループで重複を削除します。