同じ一連のポインターを含むavector<std::unique_ptr<X>>
と aがありますが、順序が異なります。vector<const X*>
一意のポインターのベクトルを const ポインターのベクトルとまったく同じように並べたいと思います。
私ができる1つの方法は次のとおりです。
vector<std::unique_ptr<X>> uniq_ptrs;
vector<const X*> const_ptrs;
vector<std::unique_ptr<X>> tmp(uniq_ptrs.size());
hash_map<const X*, int> indices;
for (int i = 0; i < const_ptrs->size(); ++i) {
indices[const_ptrs[i]] = i;
}
for (std::unique_ptr<X>& uniq_ptr : uniq_ptrs) {
tmp[indices[uniq_ptr.get()]].swap(uniq_ptr);
}
uniq_ptrs.swap(tmp)
hash_map を含むインプレース バージョン:
vector<const X*> const_ptrs;
hash_map<const X*, int> indices;
for (int i = 0; i < const_ptrs.size(); ++i) {
indices[const_ptrs[i]] = i;
}
for (int i = 0; i < const_ptrs.size(); ++i) {
std::swap(uniq_ptrs[i], uniq_ptrs[indices[const_ptrs[i]]]);
}
しかし、一時的なベクトル、ハッシュ マップ、およびデータに対する 2 つのパスを必要としない、より良い方法があることを願っています。