elephantsarecool

templates homework

Feb 21st, 2018
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.93 KB | None | 0 0
  1. #include <vector>
  2. #include <iostream>
  3.  
  4. namespace my_algorithms
  5. {
  6.  
  7. template<typename ForwardIter>
  8. void advance(ForwardIter& it, unsigned int steps)
  9. {
  10.     while(steps--)
  11.         ++it;
  12. }
  13.  
  14. template<typename InputIterator, typename OutputIterator>
  15. void copy(InputIterator b, InputIterator e, OutputIterator o)
  16. {
  17.     while(b!=e)
  18.     {
  19.         *o=*b;
  20.         ++b;
  21.         ++o;
  22.     }
  23. }
  24.  
  25. template<typename Iter, typename T>
  26. Iter find(Iter b, Iter e, const T& val)
  27. {
  28.     while(b!=e)
  29.     {
  30.         if(*b==val)return b;
  31.         ++b;
  32.     }
  33.     return e;
  34. }
  35.  
  36. template<typename Iter, typename T>
  37. Iter remove(Iter b, Iter e, const T& val)
  38. {
  39.     Iter res=b;
  40.     while(b!=e)
  41.     {
  42.         if(*b!=val)
  43.         {
  44.             *res=*b;
  45.             ++res;
  46.         }
  47.         ++b;
  48.     }
  49.     return res;
  50. }
  51.  
  52. template<typename Iter, typename T>
  53. unsigned int count(Iter b, Iter e, const T& val)
  54. {
  55.     unsigned int res=0;
  56.     while(b!=e)
  57.     {
  58.         if(*b==val)++res;
  59.         ++b;
  60.     }
  61.     return res;
  62. }
  63.  
  64. template<typename Iter>
  65. bool equal_range(Iter b, Iter e, Iter s)
  66. {
  67.     while (b != e)
  68.     {
  69.         if (*b != *s)return false;
  70.         ++b;
  71.         ++s;
  72.     }
  73.     return true;
  74. }
  75.  
  76. template<typename Iter>
  77. void sort(Iter b, Iter e)
  78. {
  79.     Iter bb=b;
  80.     while(bb!=e)
  81.     {
  82.         Iter s=b;
  83.         while(s!=e)
  84.         {
  85.             if(*s>*(s+1))std::swap(*(s+1),*s);
  86.             ++s;
  87.         }
  88.         ++bb;
  89.     }
  90. }
  91.  
  92. }
  93.  
  94. int main()
  95. {
  96.     std::vector<int> v;
  97.     v.push_back(1);
  98.     v.push_back(2);
  99.     v.push_back(1);
  100.     v.push_back(1);
  101.     v.push_back(3);
  102.     v.push_back(4);
  103.  
  104.     if (my_algorithms::count(v.begin(), v.end(), 1) != 3U)
  105.     {
  106.         std::cout << "count is not implemented correctly" << std::endl;
  107.         return 1;
  108.     }
  109.  
  110.     if (my_algorithms::count(v.begin(), v.end(), 5) != 0)
  111.     {
  112.         std::cout << "count is not implemented correctly" << std::endl;
  113.         return 1;
  114.     }
  115.  
  116.     std::vector<int>::iterator it = my_algorithms::find(v.begin(), v.end(), 3);
  117.     if (it == v.end() || *it != 3)
  118.     {
  119.         std::cout << "find is not implemented correctly" << std::endl;
  120.         return 1;
  121.     }
  122.  
  123.     it = my_algorithms::find(v.begin(), v.end(), 20);
  124.     if (it != v.end())
  125.     {
  126.         std::cout << "find is not implemented correctly" << std::endl;
  127.         return 1;
  128.     }
  129.  
  130.     it = v.begin();
  131.     my_algorithms::advance(it, 4);
  132.     if (*it != 3)
  133.     {
  134.         std::cout << "advance is not implemented correctly" << std::endl;
  135.         return 1;
  136.     }
  137.  
  138.     unsigned int originalSize = v.size();
  139.     unsigned int countOfOnes = my_algorithms::count(v.begin(), v.end(), 1);
  140.  
  141.     it = my_algorithms::remove(v.begin(), v.end(), 1);
  142.     if (my_algorithms::find(v.begin(), it, 1) != it)
  143.     {
  144.         std::cout << "remove is not implemented correctly" << std::endl;
  145.         return 1;
  146.     }
  147.  
  148.     v.erase(it, v.end());
  149.  
  150.     if (originalSize - countOfOnes != v.size())
  151.     {
  152.         std::cout << "remove is not implemented correctly" << std::endl;
  153.         return 1;
  154.     }
  155.  
  156.     v.push_back(5);
  157.     v.push_back(1);
  158.  
  159.     my_algorithms::sort(v.begin(), v.end());
  160.     // check range is correctly sorted
  161.     bool sorted = true;
  162.     for (unsigned int i = 1; i < v.size(); ++i)
  163.     {
  164.         if (v[i - 1] > v[i])
  165.         {
  166.             std::cout << "sort is not implemented correctly" << std::endl;
  167.             return 1;
  168.         }
  169.     }
  170.  
  171.     std::vector<int> q(v.size());
  172.     my_algorithms::copy(v.begin(), v.end(), q.begin());
  173.     for (unsigned int i = 0; i < q.size(); ++i)
  174.     {
  175.         if (q[i] != v[i])
  176.         {
  177.             std::cout << "copy is not implemented correctly" << std::endl;
  178.             return 1;
  179.         }
  180.     }
  181.  
  182.     if (!my_algorithms::equal_range(v.begin(), v.end(), q.begin()))
  183.     {
  184.         std::cout << "equal_range is not implemented correctly" << std::endl;
  185.         return 1;
  186.     }
  187.  
  188.     std::cout << "Seems everything is correct!!!" << std::endl;
  189.  
  190.     return 0;
  191. }
Add Comment
Please, Sign In to add comment