main.cpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /* ************************************************************************** */
  2. /* */
  3. /* ::: :::::::: */
  4. /* main.cpp :+: :+: :+: */
  5. /* +:+ +:+ +:+ */
  6. /* By: bchanot <bchanot@42.fr> +#+ +:+ +#+ */
  7. /* +#+#+#+#+#+ +#+ */
  8. /* Created: 2026/01/13 17:54:18 by bchanot #+# #+# */
  9. /* Updated: 2026/01/25 04:38:31 by bchanot ### ########.fr */
  10. /* */
  11. /* ************************************************************************** */
  12. #include <vector>
  13. #include <deque>
  14. #include <cstring>
  15. #include <iostream>
  16. #include <stdint.h>
  17. #include <string>
  18. #include <chrono>
  19. struct Pairs {
  20. int const max;
  21. int const min;
  22. Pairs(int const &a, int const &b) : max(a), min(b) {}
  23. };
  24. int parse_list(const char * str) {
  25. std::string s(str);
  26. size_t i;
  27. int num;
  28. if (s.empty())
  29. throw std::invalid_argument("Empty string");
  30. for (i = 0; i < s.size(); i++)
  31. if (!std::isdigit(s[i]))
  32. throw std::invalid_argument("Not a number");
  33. num = atoi(str);
  34. if (num < 0)
  35. throw std::invalid_argument("Negative number");
  36. return (num);
  37. }
  38. void ft_get_list(char **av, int ac, std::vector<int> &list) {
  39. int i;
  40. i = 0;
  41. while (i < ac) {
  42. list.emplace_back(parse_list(av[i]));
  43. i++;
  44. }
  45. }
  46. template < typename U, typename T >
  47. U ft_merge_insert(U list) {
  48. typedef typename U::iterator Uit;
  49. typedef typename T::iterator Tit;
  50. T pairs;
  51. Tit jt;
  52. U big;
  53. U res;
  54. Uit it;
  55. int orphan;
  56. bool hasOrphan;
  57. for (it = list.begin(); it + 1 < list.end(); it += 2)
  58. pairs.emplace_back(std::max(*it, *(it + 1)), std::min(*it, *(it + 1)));
  59. hasOrphan = (list.size() % 2 != 0);
  60. if (hasOrphan)
  61. orphan = list.back();
  62. if (pairs.size() > 1)
  63. {
  64. for (jt = pairs.begin(); jt != pairs.end(); jt++)
  65. big.emplace_back((*jt).max);
  66. res = ft_merge_insert<U, T>(big);
  67. for (jt = pairs.begin(); jt != pairs.end(); jt++)
  68. res.insert(std::lower_bound(res.begin(), res.end(), (*jt).min), (*jt).min);
  69. }
  70. else if (pairs.size() == 1) {
  71. res.emplace_back(pairs[0].min);
  72. res.emplace_back(pairs[0].max);
  73. }
  74. if (hasOrphan)
  75. res.insert(std::lower_bound(res.begin(), res.end(), orphan), orphan);
  76. return (res);
  77. }
  78. void ft_launch(std::vector<int> &list) {
  79. std::chrono::duration<signed long, std::micro> duration;
  80. std::chrono::_V2::system_clock::time_point start;
  81. std::chrono::_V2::system_clock::time_point end;
  82. std::vector<int> sorted_vec;
  83. std::deque<int> sorted_deque;
  84. std::deque<int> list_deque;
  85. size_t i;
  86. std::cout << "Before :\t" ;
  87. for (i = 0; i < list.size() && i < 5; i++) {
  88. std::cout << list[i] << " ";
  89. }
  90. if (i == 5)
  91. std::cout << "[...]";
  92. std::cout << std::endl;
  93. start = std::chrono::high_resolution_clock::now();
  94. sorted_vec = ft_merge_insert<std::vector<int>, std::vector<Pairs>>(list);
  95. end = std::chrono::high_resolution_clock::now();
  96. std::cout << "After :\t\t" ;
  97. for (i = 0; i < sorted_vec.size() && i < 5; i++) {
  98. std::cout << sorted_vec[i] << " ";
  99. }
  100. if (i == 5)
  101. std::cout << "[...]";
  102. std::cout << std::endl;
  103. duration = std::chrono::duration_cast < std::chrono::microseconds > (end - start);
  104. std::cout << "Time to process a range of " << list.size() << " elements with std::vector : " << duration.count() << " us" << std::endl;
  105. for (i = 0; i < list.size(); i++) {
  106. list_deque.emplace_back(list[i]);
  107. }
  108. start = std::chrono::high_resolution_clock::now();
  109. sorted_deque = ft_merge_insert<std::deque<int>, std::deque<Pairs>>(list_deque);
  110. end = std::chrono::high_resolution_clock::now();
  111. duration = std::chrono::duration_cast < std::chrono::microseconds > (end - start);
  112. std::cout << "Time to process a range of " << list.size() << " elements with std::deque : " << duration.count() << " us" << std::endl;
  113. }
  114. int main(int ac, char **av)
  115. {
  116. std::vector<int> list;
  117. if (ac < 2) {
  118. std::cout << "Error : No number specified" << std::endl;
  119. throw std::exception();
  120. }
  121. try {
  122. ft_get_list(++av, --ac, list);
  123. ft_launch(list);
  124. } catch (std::exception &e) {
  125. std::cout << "Error : " << e.what() << std::endl;
  126. return 1;
  127. }
  128. return 0;
  129. }