Advertisement
Redee

Дубликаты 17102015a

Oct 17th, 2015
342
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.53 KB | None | 0 0
  1. //ы
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. #include <Windows.h>
  6. using namespace std;
  7.  
  8.  
  9. struct Oper
  10. {
  11.     template<typename T>
  12.     static void dupDel(vector<T>& vData)
  13.     {
  14.         unsigned eInd, sz, n, k;
  15.         bool oneOrMore_del;
  16.         vector<T>::iterator it;
  17.  
  18.         sz = vData.size();
  19.  
  20.         // проверка на Дубликаты и Корректировка
  21.         for( oneOrMore_del = false, eInd = sz-1,  n=0; n < eInd; n++ )
  22.         {
  23.             for(k = n + 1; k < sz;)
  24.             {
  25.                 if( vData[n] == vData[k] )
  26.                 {
  27.                     it = vData.begin() + k;
  28.                     vData.erase(it);
  29.                     oneOrMore_del = true;
  30.  
  31.                     eInd--;
  32.                     sz--;
  33.                 }
  34.                 else k++;
  35.             }
  36.         }
  37.         // освобождаем память если необходимо
  38.         if(oneOrMore_del) vData.shrink_to_fit();
  39.     }
  40.  
  41.  
  42.     template<typename T>
  43.     static vector<unsigned> dupFind(const vector<T>& vData)
  44.     {
  45.         unsigned sz, szStp, eInd, n, k;
  46.         bool found_1stDup, added;
  47.         vector<unsigned> dupI;
  48.         vector<unsigned>::iterator it;
  49.         vector<unsigned>::iterator itB;
  50.  
  51.         sz = vData.size();
  52.         szStp = sz;
  53.         eInd = szStp - 1;
  54.        
  55.         // инициализация вектора Шагов для проверки Дубликатов
  56.         vector<unsigned> stepsI(szStp);
  57.         for(n=0; n < szStp; n++)
  58.         {
  59.             stepsI[n] = n;
  60.         }
  61.  
  62.         // резервируем по максимуму память для ускорения
  63.         // максимальное кол-во = 1 уникальный и все остальные дубликаты = size - 1
  64.         dupI.reserve(eInd);
  65.  
  66.         // 1ое Нахождение дубликатов
  67.         found_1stDup = false;
  68.         for( n=0; n < eInd; n++ )
  69.         {
  70.             for( k = n+1; k < szStp; )
  71.             {
  72.                 if( vData[stepsI[n]] != vData[stepsI[k]] ) k++;
  73.                 else
  74.                 {
  75.                     dupI.push_back( stepsI[k] );
  76.                     found_1stDup = true;
  77.  
  78.                     // удаление из вектора Шагов
  79.                     it = stepsI.begin() + k;
  80.                     stepsI.erase(it);
  81.                     szStp--;
  82.                     eInd--;
  83.                 }
  84.             }
  85.  
  86.             if(found_1stDup){ n++; break; }
  87.             //
  88.         }
  89.  
  90.        
  91.         // следующие проверки на Дубликаты
  92.         if(found_1stDup)
  93.         {
  94.             for( ; n < eInd; n++ )
  95.             {
  96.                 for( added = false, k = n+1; k < szStp; added = false )
  97.                 {
  98.                     if( vData[stepsI[n]] != vData[stepsI[k]] ) k++;
  99.                     else
  100.                     {
  101.                         // Добавляем в нужную Позицию чтобы стало по-Порядку !!
  102.                         for(itB = dupI.begin(), it = dupI.end()-1; it > itB; it--)
  103.                         {
  104.                             if( stepsI[k] > *it )
  105.                             {
  106.                                 it = dupI.insert(it+1, stepsI[k]);
  107.                                 it--;
  108.  
  109.                                 // удаление из вектора Шагов
  110.                                 stepsI.erase( stepsI.begin() + k );
  111.                                 eInd--;
  112.                                 szStp--;
  113.  
  114.                                 added = true;
  115.                                 break;
  116.                             }
  117.                         }
  118.  
  119.                         if(!added)
  120.                         {
  121.                             // тут итератор dupI стоит вначале
  122.                             if( stepsI[k] > *it ) dupI.insert(it+1, stepsI[k]);
  123.                             else
  124.                                 dupI.insert(it, stepsI[k]);
  125.  
  126.                             // удаление из вектора Шагов
  127.                             stepsI.erase( stepsI.begin() + k );
  128.                             eInd--;
  129.                             szStp--;
  130.                         }
  131.                     }
  132.                 }
  133.             }
  134.             //
  135.         }
  136.  
  137.         dupI.shrink_to_fit();
  138.         return dupI;
  139.         //
  140.     }
  141.  
  142.  
  143.  
  144.  
  145. };
  146.  
  147.  
  148. void main()
  149. {
  150.     vector<const char*> vD(13);
  151.  
  152.     vD[0] = "d33";
  153.     vD[1] = "d33";
  154.     vD[2] = "z44";
  155.     vD[3] = "d33";
  156.     vD[4] = "d33";
  157.     vD[5] = "x55";
  158.     vD[6] = "d33";
  159.     vD[7] = "n558797";
  160.     vD[8] = "x55";
  161.     vD[9] = "x55";
  162.     vD[10] = "d33";
  163.     vD[11] = "j77";
  164.     vD[12] = "j77";
  165.  
  166.     vector<unsigned> dI = Oper::dupFind(vD);
  167.  
  168.     for(unsigned n=0; n < dI.size(); n++)
  169.     {
  170.         cout << dI[n] << endl;
  171.     }
  172.  
  173.  
  174. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement