vector<int> reference = ages;
sort(ages.begin(),ages.end());
for (int i=0; i<20 ;++i){
for (int j=0; j<20; ++j){
if (ages[i]==reference[j]){
cout << setw(LongestString(names))<<names[j] <<setw(agewidth)<<ages[i]<<setw(probwidth)<<prob[j]<<endl;
}
}
}
所以我有三个向量,我想根据年龄对它们进行排序,然后对它们进行重新排序。然而,历代以来都有重复,所以每当它到达那些时,它会多次打印它们。有没有办法在没有结构创建的情况下阻止这种情况?
答案 0 :(得分:0)
生成从0到ages.size() - 1的索引向量。根据年龄对索引进行排序,可能使用lambda compare函数。然后根据索引的排序向量重新排序所有三个向量。这将使所有三个向量保持在&#34; sync&#34;,而不管年龄中是否有任何重复。
如果您只是根据索引排序[i] =原始[sorted_index [i]]复制矢量,则重新排序很简单。也可以进行重新排序,如下面的示例所示,但它是一个鲜为人知的算法,如果这是作业,我不知道学生应该在哪里知道这个算法或者能够找到该算法的示例。该算法基于以下事实:置换可以被认为是一系列循环:
http://en.wikipedia.org/wiki/Permutation#Cycle_notation
std::vector <int> A; // ages
std::vector <std::string> N; // names
std::vector <int> Z; // zip codes
std::vector <size_t> I; // indices
// vectors A, N, Z are initialized here ...
// initialize vector of indices
for(size_t i = 0; i < A.size(); i++)
I.push_back(i);
// sort vector of indices 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 back to 0 to size-1
// time complexity is O(n)
// every move places an element in its sorted position
for(size_t i = 0; i < A.size(); i++){
size_t j, k;
int tA; // temp variables
std::string tN;
int tZ;
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;
}
}