Создайте вектор индексов от 0 до age.size() - 1. Сортируйте индексы в соответствии с возрастом, возможно, используя функцию сравнения лямбда. Затем измените порядок всех трех векторов в соответствии с отсортированным вектором индексов. Это сохранит все три вектора в «синхронизации», независимо от каких-либо дубликатов в возрасте.
Переупорядочение простое, если вы просто скопировали вектор в соответствии с отсортированными индексами [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;
}
}
Но как предотвратить выводятся повторяющиеся значений данных существует несколько значений в вектор имен, которые соответствуют одинаковых возрастов? – HowDoesOneR
@HowDoesOneR - неважно, стабилен ли тип (например, std :: stable_sort), тогда будет сохранен исходный порядок возрастов. Даже если сортировка нестабильна, она все равно сохранит три вектора в синхронизации во время переупорядочения. Дубликаты возрастов не приведут к дублированию значений в других векторах (если в других векторах нет отдельных наборов дубликатов). – rcgldr
Когда я пытаюсь использовать этот код с SIZE = 20, я получаю ошибку сегментации? Я использую размер неправильно? – HowDoesOneR