2

同じ一連のポインターを含む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 つのパスを必要としない、より良い方法があることを願っています。

4

2 に答える 2

1

にはと同じポインターconst_ptrsが含まれているため、後者を使用する必要はまったくなく、一時的なものも必要ありません。ただし、オブジェクトを削除しないように注意する必要があります。uniq_ptrs

// release the unique_ptrs of their ownership
for(auto&x : uniq_ptrs)
    x.release();
// fill the array with the pointers in another order
uniq_ptrs.clear();
for(auto x : const_ptrs)
    uniq_ptrs.emplace_back(const_cast<X*>(x));   // const_cast okay here
于 2013-09-12T21:57:04.467 に答える