У меня есть vector<std::unique_ptr<X>>
и vector<const X*>
, которые содержат один и тот же набор указателей, но в другом порядке. Я хочу, чтобы вектор уникальных указателей упорядочивался точно так же, как вектор указателей const.вектор повторного заказа <станд :: unique_ptr <X>> задан вектор <const X*>
Один способ, которым я мог бы это сделать, как это:
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]]]);
}
Но я надеюсь, что есть более хороший способ, который не включают временный вектор хэш-карту и два прохода над данными.
Вспомогательная конструкция дает вам линейную сложность при перестановке. Без этого вам нужно будет чаще проходить по диапазону. –
Поскольку вы имеете дело с указателями, не можете ли вы создать новый вектор> зацикливание через вектор const_ptrs. –
jayadev
@jayadev, мне нужно будет удалить константу с кастингом. – thesamet