Я сортирую 2 вектора, используя вектор индекса.
2 вектора имеют разный размер. Один вектор (ключи) имеет размер X, а другой (дескрипторы) - размер X * 128 (один ключ параметризован 128 значениями).
Чтобы создать вектор индекса, я сгенерировал вектор без знака и использовал функцию йоты для вставки в этот вектор [0,1,2, ..., X]
затем я использую функцию сортировки для сортировки этих индексов в зависимости от масштаба клавиши (keys [i] .s).
После этого я генерирую другой вектор, в котором я копирую значения, используя вектор индекса для дескрипторов и ключей (называя их descriptors_tmp и keys_tmp), а затем хочу сделать первый вектор ключей равным keys_tmp, и то же самое для дескрипторов равно descriptors_tmp.
Мой вопрос:
-Есть способ сделать это без копирования. Поскольку мне не нужна предыдущая версия ключей и дескрипторов, я мог бы просто указать вектор на другом векторе (что-то вроде * keys = * keys_tmp)?
- Есть ли более простой способ достичь того, чего я пытаюсь достичь?
Мой код:
void _siftMatch::getIdxOfSorting(std::vector<unsigned>& idx_scale_order)
{
//keys[i].s is the scale and I sort depending decreasing scale
auto cmp_scale = [this](int i, int j) {
return keys[i].s > keys[j].s;
};
std::sort(idx_scale_order.begin(), idx_scale_order.end(), cmp_scale);
}
void _siftMatch::sort() {
//vector containing the index of sorted
std::vector<unsigned>idx_scale_order;
idx_scale_order.resize(keys.size());
//Generate [0,1,...,X]
std::iota(idx_scale_order.begin(), idx_scale_order.end(), 0);
//Sort the vector
getIdxOfSorting(idx_scale_order);
std::vector<float> descriptors_tmp;
std::vector<SiftGPU::SiftKeypoint> keys_tmp;
for (int i = 0; i < idx_scale_order.size(); ++i) {
keys_tmp.push_back(keys[idx_scale_order[i]]);
for (int j = 0; j < 128; ++j)
descriptors_tmp.push_back(descriptors[idx_scale_order[i] * 128 + j]);
}
//This is here that I want to put descriptors_tmp and keys_tmp in descriptors and keys
//descriptors.swap(descriptors_tmp.data);
}