/*
* vector 的包装器,在 vector 上添加了`-`一元和二元运算符,以及`--`前缀和后缀运算符
* */
#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>
// 确保所有元素都具有相同的类型
template<typename T, typename... Args>
concept SameType = (std::same_as<T, Args> && ...);
template <typename T>
class MyVector {
public:
template <SameType<T>... Tn>
explicit MyVector(const T& arg, const Tn&... args) : m_values{} {
m_values.push_back(arg);
(m_values.push_back(args), ...);
}
explicit MyVector(std::vector<T> values) : m_values{std::move(values)} {}
void print() const {
std::copy(m_values.begin(), m_values.end(), std::ostream_iterator<T>(std::cout, " "));
std::cout << std::endl;
}
// 重载一元运算符`-`,返回一个新对象,其中所有元素为原对象的相反数。
MyVector<T> operator-() const {
auto result{*this};
std::transform(result.m_values.begin(), result.m_values.end(), result.m_values.begin(), [](const auto& val){return -val;});
return result;
}
// 重载二元运算符`-`,返回一个新对象,其中的元素是两个对象内各个元素对应相减的结果。
MyVector<T> operator-(const MyVector<T>& rhs) const {
size_t minN {std::min(m_values.size(), rhs.m_values.size())};
std::vector<T> temp(minN);
for (size_t i{0}; i < minN; ++i) {
temp[i] = m_values[i] - rhs.m_values[i];
}
return MyVector{std::move(temp)};
}
// 重载前缀一元运算符`--`
MyVector<T>& operator--() {
std::transform(this->m_values.begin(), this->m_values.end(), this->m_values.begin(), [](auto& val){return --val;});
return *this;
}
// 重载后缀一元运算符`--`
MyVector<T> operator--(int) {
auto result{*this};
--*this;
return result;
}
private:
std::vector<T> m_values;
};