Advertisement
TrickmanOff

asfdg

Oct 3rd, 2020
235
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.10 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. class T {
  6. public:
  7. // reduced all by -1 in ctor
  8. // default - 2
  9. int x;
  10.  
  11. T(): x(2) {}
  12. T(int _x): x(_x - 1) {}
  13.  
  14. bool operator==(int _x) const {
  15. return x + 1 == _x;
  16. }
  17.  
  18. bool operator!=(int _x) const {
  19. return !(*this == _x);
  20. }
  21. };
  22.  
  23. std::ostream& operator<<(std::ostream& out, const T& t) {
  24. out << (t.x + 1);
  25. return out;
  26. }
  27.  
  28.  
  29.  
  30.  
  31.  
  32.  
  33.  
  34.  
  35. // можно сравнивать с ValueType с int == и !=
  36.  
  37. template <typename ValueType>
  38. class Polynomial {
  39. //private:
  40. public:
  41. ValueType ZERO;
  42. std::vector<ValueType> coeffs;
  43.  
  44. void delete_leading_zeros();
  45.  
  46. //public:
  47. // ctors
  48. explicit Polynomial(const std::vector<ValueType>&);
  49. explicit Polynomial(const ValueType& = ValueType());
  50.  
  51. template <typename Iter>
  52. Polynomial(Iter first, Iter last);
  53.  
  54. int Degree() const;
  55.  
  56. const ValueType& operator[](size_t index) const;
  57. ValueType& operator[](size_t index);
  58.  
  59. typename std::vector<ValueType>::const_iterator begin();
  60. typename std::vector<ValueType>::const_iterator end();
  61. };
  62.  
  63. //template<typename ValueType>
  64. //const ValueType Polynomial<ValueType>::ZERO(0);
  65.  
  66. template<typename ValueType>
  67. void Polynomial<ValueType>::delete_leading_zeros() {
  68. while (!coeffs.empty() && coeffs.back() == 0) {
  69. coeffs.pop_back();
  70. }
  71. }
  72.  
  73. template<typename ValueType>
  74. Polynomial<ValueType>::Polynomial(const std::vector<ValueType>& coeffs_vec):
  75. coeffs(coeffs_vec.begin(), coeffs_vec.end()), ZERO(ValueType(0)) {
  76. delete_leading_zeros();
  77. }
  78.  
  79. template<typename ValueType>
  80. Polynomial<ValueType>::Polynomial(const ValueType& coeff): coeffs{coeff}, ZERO(ValueType(0)) {
  81. delete_leading_zeros();
  82. }
  83.  
  84. template<typename ValueType>
  85. template<typename Iter>
  86. Polynomial<ValueType>::Polynomial(Iter first, Iter last): coeffs(first, last), ZERO(ValueType(0)) {
  87. delete_leading_zeros();
  88. }
  89.  
  90. template<typename ValueType>
  91. int Polynomial<ValueType>::Degree() const {
  92. return static_cast<int>(coeffs.size()) - 1;
  93. }
  94.  
  95. template<typename ValueType>
  96. const ValueType& Polynomial<ValueType>::operator[](size_t index) const {
  97. if (index > Degree()) {
  98. return ZERO;
  99. } else {
  100. return coeffs[index];
  101. }
  102. }
  103.  
  104. template<typename ValueType>
  105. ValueType &Polynomial<ValueType>::operator[](size_t index) {
  106. return coeffs[index];
  107. }
  108.  
  109. template<typename ValueType>
  110. typename std::vector<ValueType>::const_iterator Polynomial<ValueType>::begin() {
  111. return coeffs.begin();
  112. }
  113.  
  114. template<typename ValueType>
  115. typename std::vector<ValueType>::const_iterator Polynomial<ValueType>::end() {
  116. return coeffs.end();
  117. }
  118.  
  119. template<typename ValueType>
  120. ValueType operator+(const Polynomial<ValueType>& lhs, const Polynomial<ValueType>& rhs) {
  121. std::vector<ValueType> res;
  122.  
  123. for (size_t deg = 0; deg <= std::max(lhs.Degree(), rhs.Degree()); ++deg) {
  124. res.push_back(lhs[deg] + rhs[deg]);
  125. }
  126. return Polynomial(res);
  127. }
  128.  
  129. template<typename ValueType>
  130. ValueType operator+(const Polynomial<ValueType>& lhs, const ValueType& rhs) {
  131. return Polynomial(lhs[0] + rhs);
  132. }
  133.  
  134. template<typename ValueType>
  135. ValueType operator+(const ValueType& lhs, const Polynomial<ValueType>& rhs) {
  136. return rhs + lhs;
  137. }
  138.  
  139. template<typename ValueType>
  140. ValueType operator-(const Polynomial<ValueType>& lhs, const Polynomial<ValueType>& rhs) {
  141. std::vector<ValueType> res;
  142. for (size_t deg = 0; deg <= std::max(lhs.Degree(), rhs.Degree()); ++deg) {
  143. res.push_back(lhs[deg] + rhs[deg]);
  144. }
  145. return Polynomial(res);
  146. }
  147.  
  148. template<typename ValueType>
  149. ValueType operator-(const Polynomial<ValueType>& lhs, const ValueType& rhs) {
  150. return Polynomial(lhs[0] - rhs);
  151. }
  152.  
  153. template<typename ValueType>
  154. ValueType operator-(const ValueType& lhs, const Polynomial<ValueType>& rhs) {
  155. return Polynomial(lhs - rhs[0]);
  156. }
  157.  
  158. using namespace std;
  159.  
  160. int main() {
  161. vector<T> vec = {{1}, {2}, {-5}};
  162.  
  163. Polynomial<T> poly(vec);
  164. for (const auto& x : poly) {
  165. cout << x << ' ';
  166. }
  167. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement