Advertisement
Redee

Дубликаты 17102015b

Oct 17th, 2015
294
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.09 KB | None | 0 0
  1. //ы
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. using namespace std;
  6.  
  7.  
  8. template<typename T>
  9. struct twoVectors
  10. {
  11.     vector<T> vFirst;
  12.     vector<T> vSecond;
  13. };
  14.  
  15. typedef twoVectors<unsigned> twoVU;
  16. typedef twoVectors<int> twoVI;
  17. typedef twoVectors<float> twoVF;
  18.  
  19.  
  20.  
  21. struct Oper
  22. {
  23.     template<typename T>
  24.     static void dupDel(vector<T>& vData)
  25.     {
  26.         unsigned eInd, n, k;
  27.         bool oneOrMore_del;
  28.         vector<T>::iterator it;
  29.  
  30.         sz = vData.size();
  31.  
  32.         // проверка на Дубликаты и Корректировка
  33.         for( oneOrMore_del = false, eInd = sz-1,  n=0; n < eInd; n++ )
  34.         {
  35.             for(k = n + 1; k < sz;)
  36.             {
  37.                 if( vData[n] == vData[k] )
  38.                 {
  39.                     it = vData.begin() + k;
  40.                     vData.erase(it);
  41.                     oneOrMore_del = true;
  42.  
  43.                     eInd--;
  44.                     sz--;
  45.                 }
  46.                 else k++;
  47.             }
  48.         }
  49.         // освобождаем память если необходимо
  50.         if(oneOrMore_del) vData.shrink_to_fit();
  51.     }
  52.  
  53.     //
  54.  
  55.     template<typename T>
  56.     static vector<unsigned> dupFind(const vector<T>& vData)
  57.     {
  58.         unsigned szStp, eInd, n, k;
  59.         bool found_1stDup, added;
  60.         vector<unsigned> dupI;
  61.         vector<unsigned>::iterator it;
  62.         vector<unsigned>::iterator itB;
  63.  
  64.         szStp = vData.size();
  65.         eInd = szStp - 1;
  66.        
  67.         // инициализация вектора Шагов для проверки Дубликатов
  68.         vector<unsigned> stepsI(szStp);
  69.         for(n=0; n < szStp; n++)
  70.         {
  71.             stepsI[n] = n;
  72.         }
  73.  
  74.         // резервируем по максимуму память для ускорения
  75.         // максимальное кол-во = 1 уникальный и все остальные дубликаты = size - 1
  76.         dupI.reserve(eInd);
  77.  
  78.         // 1ое Нахождение дубликатов
  79.         found_1stDup = false;
  80.         for( n=0; n < eInd; n++ )
  81.         {
  82.             for( k = n+1; k < szStp; )
  83.             {
  84.                 if( vData[stepsI[n]] != vData[stepsI[k]] ) k++;
  85.                 else
  86.                 {
  87.                     dupI.push_back( stepsI[k] );
  88.                     found_1stDup = true;
  89.  
  90.                     // удаление из вектора Шагов
  91.                     it = stepsI.begin() + k;
  92.                     stepsI.erase(it);
  93.                     szStp--;
  94.                     eInd--;
  95.                 }
  96.             }
  97.  
  98.             if(found_1stDup){ n++; break; }
  99.             //
  100.         }
  101.  
  102.        
  103.         // следующие проверки на Дубликаты
  104.         if(found_1stDup)
  105.         {
  106.             for( ; n < eInd; n++ )
  107.             {
  108.                 for( added = false, k = n+1; k < szStp; added = false )
  109.                 {
  110.                     if( vData[stepsI[n]] != vData[stepsI[k]] ) k++;
  111.                     else
  112.                     {
  113.                         // Добавляем в нужную Позицию чтобы стало по-Порядку !!
  114.                         for(itB = dupI.begin(), it = dupI.end()-1; it > itB; it--)
  115.                         {
  116.                             if( stepsI[k] > *it )
  117.                             {
  118.                                 it = dupI.insert(it+1, stepsI[k]);
  119.                                 it--;
  120.  
  121.                                 // удаление из вектора Шагов
  122.                                 stepsI.erase( stepsI.begin() + k );
  123.                                 eInd--;
  124.                                 szStp--;
  125.  
  126.                                 added = true;
  127.                                 break;
  128.                             }
  129.                         }
  130.  
  131.                         if(!added)
  132.                         {
  133.                             // тут итератор dupI стоит вначале
  134.                             if( stepsI[k] > *it ) dupI.insert(it+1, stepsI[k]);
  135.                             else
  136.                                 dupI.insert(it, stepsI[k]);
  137.  
  138.                             // удаление из вектора Шагов
  139.                             stepsI.erase( stepsI.begin() + k );
  140.                             eInd--;
  141.                             szStp--;
  142.                         }
  143.                     }
  144.                 }
  145.             }
  146.             //
  147.         }
  148.  
  149.         dupI.shrink_to_fit();
  150.         return dupI;
  151.         //
  152.     }
  153.  
  154.     //
  155.  
  156.     template<typename T>
  157.     static vector<unsigned> uniqFind(const vector<T>& vData)
  158.     {
  159.         unsigned szStp, eInd, n, k;
  160.         vector<unsigned> dupI;
  161.  
  162.         szStp = vData.size();
  163.         eInd = szStp - 1;
  164.        
  165.         // инициализация вектора Шагов для проверки Дубликатов
  166.         vector<unsigned> stepsI(szStp);
  167.         for(n=0; n < szStp; n++)
  168.         {
  169.             stepsI[n] = n;
  170.         }
  171.  
  172.         // Фильтрация на Уникальные индексы
  173.         for( n=0; n < eInd; n++ )
  174.         {
  175.             for( k = n+1; k < szStp; )
  176.             {
  177.                 if( vData[stepsI[n]] != vData[stepsI[k]] ) k++;
  178.                 else
  179.                 {
  180.                     // удаление из вектора Шагов
  181.                     stepsI.erase( stepsI.begin() + k );
  182.                     szStp--;
  183.                     eInd--;
  184.                 }
  185.             }
  186.         }
  187.  
  188.         stepsI.shrink_to_fit();
  189.         return stepsI;
  190.         //
  191.     }
  192.  
  193.     //
  194.    
  195.     template<typename T>
  196.     static twoVU uniqueAndDup_Find(const vector<T>& vData)
  197.     {
  198.         unsigned szStp, eInd, n, k;
  199.         bool found_1stDup, added;
  200.         vector<unsigned> dupI;
  201.         vector<unsigned>::iterator it;
  202.         vector<unsigned>::iterator itB;
  203.  
  204.         szStp = vData.size();
  205.         eInd = szStp - 1;
  206.        
  207.         // инициализация вектора Шагов для проверки Дубликатов
  208.         vector<unsigned> stepsI(szStp);
  209.         for(n=0; n < szStp; n++)
  210.         {
  211.             stepsI[n] = n;
  212.         }
  213.  
  214.         // резервируем по максимуму память для ускорения
  215.         // максимальное кол-во = 1 уникальный и все остальные дубликаты = size - 1
  216.         dupI.reserve(eInd);
  217.  
  218.         // 1ое Нахождение дубликатов
  219.         found_1stDup = false;
  220.         for( n=0; n < eInd; n++ )
  221.         {
  222.             for( k = n+1; k < szStp; )
  223.             {
  224.                 if( vData[stepsI[n]] != vData[stepsI[k]] ) k++;
  225.                 else
  226.                 {
  227.                     dupI.push_back( stepsI[k] );
  228.                     found_1stDup = true;
  229.  
  230.                     // удаление из вектора Шагов
  231.                     it = stepsI.begin() + k;
  232.                     stepsI.erase(it);
  233.                     szStp--;
  234.                     eInd--;
  235.                 }
  236.             }
  237.  
  238.             if(found_1stDup){ n++; break; }
  239.             //
  240.         }
  241.  
  242.        
  243.         // следующие проверки на Дубликаты
  244.         if(found_1stDup)
  245.         {
  246.             for( ; n < eInd; n++ )
  247.             {
  248.                 for( added = false, k = n+1; k < szStp; added = false )
  249.                 {
  250.                     if( vData[stepsI[n]] != vData[stepsI[k]] ) k++;
  251.                     else
  252.                     {
  253.                         // Добавляем в нужную Позицию чтобы стало по-Порядку !!
  254.                         for(itB = dupI.begin(), it = dupI.end()-1; it > itB; it--)
  255.                         {
  256.                             if( stepsI[k] > *it )
  257.                             {
  258.                                 it = dupI.insert(it+1, stepsI[k]);
  259.                                 it--;
  260.  
  261.                                 // удаление из вектора Шагов
  262.                                 stepsI.erase( stepsI.begin() + k );
  263.                                 eInd--;
  264.                                 szStp--;
  265.  
  266.                                 added = true;
  267.                                 break;
  268.                             }
  269.                         }
  270.  
  271.                         if(!added)
  272.                         {
  273.                             // тут итератор dupI стоит вначале
  274.                             if( stepsI[k] > *it ) dupI.insert(it+1, stepsI[k]);
  275.                             else
  276.                                 dupI.insert(it, stepsI[k]);
  277.  
  278.                             // удаление из вектора Шагов
  279.                             stepsI.erase( stepsI.begin() + k );
  280.                             eInd--;
  281.                             szStp--;
  282.                         }
  283.                     }
  284.                 }
  285.             }
  286.             //
  287.         }
  288.  
  289.         twoVU tVi;
  290.         tVi.vFirst = stepsI;
  291.         tVi.vSecond = dupI;
  292.  
  293.         return tVi;
  294.         //
  295.     }
  296.  
  297.  
  298. };
  299.  
  300.  
  301. void main()
  302. {
  303.     vector<const char*> vD(13);
  304.  
  305.     vD[0] = "d33";
  306.     vD[1] = "d33";
  307.     vD[2] = "z44";
  308.     vD[3] = "d33";
  309.     vD[4] = "d33";
  310.     vD[5] = "x55";
  311.     vD[6] = "d33";
  312.     vD[7] = "n558797";
  313.     vD[8] = "x55";
  314.     vD[9] = "x55";
  315.     vD[10] = "d33";
  316.     vD[11] = "j77";
  317.     vD[12] = "j77";
  318.  
  319.  
  320.     cout << "Unique Indexes: " << endl;
  321.     twoVU udI = Oper::uniqueAndDup_Find(vD);
  322.     for(unsigned n=0; n < udI.vFirst.size(); n++)
  323.     {
  324.         cout << udI.vFirst[n] << endl;
  325.     }
  326.     cout << endl;
  327.  
  328.  
  329.     cout << "Duplicate Indexes: " << endl;
  330.     for(unsigned n=0; n < udI.vSecond.size(); n++)
  331.     {
  332.         cout << udI.vSecond[n] << endl;
  333.     }
  334.    
  335.  
  336.  
  337. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement