いわゆる辞書順で要素を比較していくグローバル関数を作成することになります。
template <typename T>
class myvector
{
...
};
/**
* @brief Compares the contents of lhs and rhs lexicographically.
* The comparison is performed by a function equivalent to
* std::lexicographical_compare.
* @param[in] lhs: Containers whose contents to compare in left-hand-side.
* @param[in] rhs: Containers whose contents to compare in right-hand-side.
* @tparam T: The type of the myvector elements. T must meet the requirements
* of LessThanComparable in order to use overloads. The ordering
* relation must establish total order.
* @return true if the contents of the lhs are lexicographically less than
* the contents of rhs, false otherwise.
*/
template <class T>
bool operator<(const myvector<T>& lhs, const myvector<T>& rhs)
{
return (
std::lexicographical_compare(
lhs.begin(), lhs.end(), rhs.begin(), rhs.end()
)
);
}
/**
* @brief Compares the contents of lhs and rhs lexicographically.
* The comparison is performed by a function equivalent to
* std::lexicographical_compare.
* @param[in] lhs: Containers whose contents to compare in left-hand-side.
* @param[in] rhs: Containers whose contents to compare in right-hand-side.
* @tparam T: The type of the myvector elements. T must meet the requirements
* of LessThanComparable in order to use overloads. The ordering
* relation must establish total order.
* @return true if the contents of the lhs are lexicographically less than
* the contents of rhs, false otherwise.
*/
template <class T>
bool operator<=(const myvector<T>& lhs, const myvector<T>& rhs)
{
return not (
std::lexicographical_compare(
rhs.begin(), rhs.end(), lhs.begin(), lhs.end()
)
);
}
/**
* @brief Compares the contents of lhs and rhs lexicographically.
* The comparison is performed by a function equivalent to
* std::lexicographical_compare.
* @param[in] lhs: Containers whose contents to compare in left-hand-side.
* @param[in] rhs: Containers whose contents to compare in right-hand-side.
* @tparam T: The type of the myvector elements. T must meet the requirements
* of LessThanComparable in order to use overloads. The ordering
* relation must establish total order.
* @return true if the contents of the lhs are lexicographically greater than
* the contents of rhs, false otherwise.
*/
template <class T>
bool operator>(const myvector<T>& lhs, const myvector<T>& rhs)
{
return (
std::lexicographical_compare(
rhs.begin(), rhs.end(), lhs.begin(), lhs.end()
)
);
}
/**
* @brief Compares the contents of lhs and rhs lexicographically.
* The comparison is performed by a function equivalent to
* std::lexicographical_compare.
* @param[in] lhs: Containers whose contents to compare in left-hand-side.
* @param[in] rhs: Containers whose contents to compare in right-hand-side.
* @tparam T: The type of the myvector elements. T must meet the requirements
* of LessThanComparable in order to use overloads. The ordering
* relation must establish total order.
* @return true if the contents of the lhs are lexicographically less than
* the contents of rhs, false otherwise.
*/
template <class T>
bool operator>=(const myvector<T>& lhs, const myvector<T>& rhs)
{
return not (
std::lexicographical_compare(
lhs.begin(), lhs.end(), rhs.begin(), rhs.end()
)
);
}
比較はすべて、std::lexicographical_compare() を使います。operator< は、std::lexicographical_compare() をそのまま、
operator<= は、左辺と右辺を逆にした上で、not std::lexicographical_compare()、
operator> は、左辺と右辺を逆にした std::lexicographical_compare()、
operator>= は、not std::lexicographical_compare()、
をそれぞれ返すようにします。
全ソースコード: https://github.com/suomesta/myvector/tree/master/032
0 件のコメント:
コメントを投稿