Advertisement
Redee

Удаление дубликатов из вектора

Oct 15th, 2015
453
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.00 KB | None | 0 0
  1. //ы
  2.  
  3. #include <iostream>
  4. #include <vector>
  5. using namespace std;
  6.  
  7. // Тестирование - удаление дубликатов из вектора
  8. void main()
  9. {
  10.     unsigned eInd, sz, sZe, n, k, j;
  11.     bool oneOrMore_del;
  12.     vector<unsigned> dubIn;
  13.     vector<const char*>::iterator itCh;
  14.     vector<const char*> vPath(9);
  15.  
  16.     for(n=0; n < 9; n++)
  17.     {
  18.         if(n < 2) vPath[n] = "n78";
  19.         else if(n==2 || n==3 || n==5)
  20.             vPath[n] = "zz33";
  21.         else if(n > 6)
  22.             vPath[n] = "r56";
  23.         else
  24.             vPath[n] = "d22";
  25.     }
  26.  
  27.     sz = vPath.size();
  28.     // вывод всех ячеек вектора
  29.     for(n=0; n < sz; n++)
  30.     {
  31.         cout << vPath[n] << endl;
  32.     }
  33.     cout << endl;
  34.  
  35.     // проверка на Дубликаты и Корректировка
  36.     for( oneOrMore_del = false, eInd = sz-1,  n=0; n < eInd; n++ )
  37.     {
  38.         for(k = n + 1; k < sz; k++)
  39.         {
  40.             if( vPath[n] == vPath[k] )
  41.             {
  42.                 // заносим Индекс в вектор дубликатов
  43.                 dubIn.push_back(k);
  44.             }
  45.         }
  46.  
  47.         // сверяемся есть ли дубликаты
  48.         sZe = dubIn.size();
  49.         if(sZe)
  50.         {
  51.             for(j=0; j < sZe; j++)
  52.             {
  53.                 // с каждым удалением Реальные индексы будут смещаться
  54.                 // минусуем позицию счетчиком цикла
  55.                 itCh = vPath.begin() + dubIn[j] - j;
  56.                 vPath.erase(itCh);
  57.             }
  58.             oneOrMore_del = true;
  59.  
  60.             eInd -= sZe;
  61.             sz -= sZe;
  62.  
  63.             // очищаем век. дубл.
  64.             dubIn.clear();
  65.             dubIn.shrink_to_fit();
  66.         }
  67.     }
  68.     // освобождаем память если необходимо
  69.     if(oneOrMore_del) vPath.shrink_to_fit();
  70.  
  71.     // Информация о размере и занимаемой памяти
  72.     cout << sz << endl;
  73.     cout << vPath.size() << endl;
  74.     cout << vPath.capacity() << endl;
  75.  
  76.     // вывод всех ячеек вектора после Корректировки
  77.     for(n=0; n < sz; n++)
  78.     {
  79.         cout << vPath[n] << endl;
  80.     }
  81.  
  82.     /////////
  83.     // Спасибо за Внимание !!! )))
  84.     ////
  85. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement