排序三个向量,基于一个的排列,有重复项
Sorting Three vectors based on the arrangement of one, with duplicates.
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到ages.size()-1的索引向量。根据年龄对索引进行排序,可能使用lambda比较函数。然后根据排序后的索引向量对这三个向量重新排序。这将使所有三个向量保持"同步",无论年龄是否重复。
如果你只是按照索引排序[i] = original[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;
}
}
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- Makefile 创建两个库 - 一个依赖于另一个
- C++ 删除存在于另一个矢量中的矢量项,同时保留顺序
- 在 c 中给定一个固定数的情况下,找到所有可能的加法和组合(给定一个总和,找到它的可能的加法和排列
- 有没有一种 STL 方法可以找到字符串的所有排列,给出一个以 C++ 为单位的大小?
- 下一个排列定义
- 如何编写一个类似于kernellist_head的c++风格的双链表实现
- 构造一个类似于JSON文件c++的字符串
- 最大数量.给定一个非负整数列表,排列它们以使它们形成最大的数字
- 我的代码仅适用于一个输入.请指教
- 在linux中动态地将应用程序窗口排列在一个又一个之上
- 外部声明变量的定义适用于一个函数,但不适用于另一个函数
- 将多个(300)方法应用于一个数据的巧妙方法
- 确定谓词是否适用于一个范围的全部、部分或全部元素
- 依赖于一个空std::string的索引0是不是不好?
- 如何使图片适合于一个静态控件vc++ win32
- C++ 矢量复制适用于一个向量,但不适用于另一个向量
- 我们如何在openGL中相对于一个点(而不是原点)旋转2d中的图形
- 并集对象的行为类似于一个结构