2016-11-03 1 views
0
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 до 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; 
     } 
    } 
+0

Но как предотвратить выводятся повторяющиеся значений данных существует несколько значений в вектор имен, которые соответствуют одинаковых возрастов? – HowDoesOneR

+0

@HowDoesOneR - неважно, стабилен ли тип (например, std :: stable_sort), тогда будет сохранен исходный порядок возрастов. Даже если сортировка нестабильна, она все равно сохранит три вектора в синхронизации во время переупорядочения. Дубликаты возрастов не приведут к дублированию значений в других векторах (если в других векторах нет отдельных наборов дубликатов). – rcgldr

+0

Когда я пытаюсь использовать этот код с SIZE = 20, я получаю ошибку сегментации? Я использую размер неправильно? – HowDoesOneR

Смежные вопросы