032: operator==, operator!=

operator==, operator!= を定義します。

要素を1つずつ比較していくグローバル関数を作成することになります。

template <typename T>
class myvector
{

...

};

/**
 * @brief      Checks if the contents of lhs and rhs are equal, that is, they
 *             have the same number of elements and each element in lhs compares
 *             equal with the element in rhs at the same position.
 * @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 EqualityComparable in order to use overloads.
 * @return     true if the contents of the containers are equal, false otherwise.
 */
template <class T>
bool operator==(const myvector<T>& lhs, const myvector<T>& rhs)
{
    return (
        (lhs.size() == rhs.size()) &&
        std::equal(lhs.begin(), lhs.end(), rhs.begin())
    );
}

/**
 * @brief      Checks if the contents of lhs and rhs are not equal, that is, they
 *             do not have the same number of elements or one or more elements in lhs
 *             compares not equal with the element in rhs at the same position.
 * @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 EqualityComparable in order to use overloads.
 * @return     true if the contents of the containers are not equal, false otherwise.
 */
template <class T>
bool operator!=(const myvector<T>& lhs, const myvector<T>& rhs)
{
    return not (
        (lhs.size() == rhs.size()) &&
        std::equal(lhs.begin(), lhs.end(), rhs.begin())
    );
}
比較ではまず size() を比べます。これは、size() が O(1) であるので、いわゆる門前払いに有効なためです。
size() が同じであれば、std::equal() を使って、要素を一つずつ比較してきます。


全ソースコード: https://github.com/suomesta/myvector/tree/master/032

0 件のコメント:

コメントを投稿