我有四个 vector ,其中包含圆心的 x、y、半径和重量信息。我想按重量顺序对它们进行排序(从最高到最低),但我真的不知道如何或从哪里开始。我可以将所有 vector 放在 Eigen::Tensor
中如果有帮助的话,将收集的数据保存在一个 4d 矩阵中。但除此之外我不知道。
每个 vector 包含 134 个元素,但由于只有其中一个需要排序,这意味着排序算法并不那么重要。
有人知道从哪里开始吗?
最佳答案
您可以创建第 5 个索引 vector ,根据 4 个 vector 之一对索引 vector 进行排序,然后在 O(n) 时间内重新排序所有 4 个 vector (并对索引 vector 进行排序)。根据 3 个 vector 之一(年龄 vector )对 3 个 vector 进行排序的示例。创建索引 vector I,然后根据 A 进行排序(使用 lambda 比较),然后通过撤消 I 中的“循环”,根据 I 对所有 3 个 vector 和 I 重新排序。
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>
int main()
{
std::vector <int> A; // ages
std::vector <std::string> N; // names
std::vector <int> Z; // zip codes
std::vector <size_t> I; // indices
int tA;
std::string tN;
int tZ;
A.push_back(37);
N.push_back("Ted");
Z.push_back(54211);
A.push_back(21);
N.push_back("John");
Z.push_back(53421);
A.push_back(31);
N.push_back("Fred");
Z.push_back(52422);
A.push_back(21);
N.push_back("Sam");
Z.push_back(51422);
// display the vectors
for(size_t i = 0; i < A.size(); i++)
std::cout << std::setw(6) << N[i]
<< std::setw(8) << Z[i]
<< std::setw(4) << A[i] << std::endl;
std::cout << std::endl;
// initialize the vector of indices
for(size_t i = 0; i < A.size(); i++)
I.push_back(i);
// sort I according to A
std::stable_sort(I.begin(), I.end(),
[&A](size_t i, size_t j) {return
A[i] < A[j];});
// reorder A, N, Z in place also restore I
// time complexity is O(n)
for(size_t i = 0; i < A.size(); i++){
size_t j, k;
if(i != I[i]){
tA = A[i];
tN = N[i];
tZ = Z[i];
k = i;
while(i != (j = I[k])){
A[k] = A[j];
N[k] = N[j];
Z[k] = Z[j];
I[k] = k;
k = j;
}
A[k] = tA;
N[k] = tN;
Z[k] = tZ;
I[k] = k;
}
}
// display the sorted vectors
for(size_t i = 0; i < A.size(); i++)
std::cout << std::setw(6) << N[i]
<< std::setw(8) << Z[i]
<< std::setw(4) << A[i] << std::endl;
return 0;
}
关于c++ - 根据一个 vector 对多个 vector 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43788429/