【c++】独自クラスを詰めたvectorをfindにかけるなら、演算子オーバーロードはかならず実装する

c++でコーディングしてるとき。

vectorを独自データクラスでつくって、そのvectorをfindにかけたいときがある。

vector内のとある要素を見つけ出して、その要素番号を知りたいときとかね。

コード

    auto itr = find(vector.begin(), vector.end(), objOriginalDataClass);
    bool bFound = itr != vector.end();
    if (bFound)
    {
        int nIndex = distance(vector.begin(), itr);
    }

こんなイメージ。

objOriginalDataClass

これと合致する要素のインデックスを得ると。

ただ、コンパイル時にこんなエラー↓がでることがある。

エラー    2    error C2678: 二項演算子 '==' : 型 '***' の左オペランドを扱う演算子が見つかりません (または変換できません) (新しい動作; ヘルプを参照)。    C:\Program Files (x86)\VC\include\xutility    3026    1   ***

このエラーは、findをつかうときに

    class _Ty> inline
    _InIt _Find(_InIt _First, _InIt _Last, const _Ty& _Val, false_type)
    {    // find first matching _Val
    for (; _First != _Last; ++_First)
        if (*_First == _Val)
            break;
    return (_First);
    }

このコードの

        if (*_First == _Val)

ココで、’==’による比較をしてるんだけど、vectorに詰められたデータが独自データクラスから作られてるもんだから単純に’==’で比較できないぞ。つって怒られてんだな。


解決策は、独自データクラスで’==’のオーバーロードをちゃんと実装すること。

# AprOriginalDataClass.h

public:
    // 演算子オーバーロード
    BOOL AprOriginalDataClass::operator==(const AprOriginalDataClass& rhs);

private:
    int m_nArr[2];    // たとえば、整数型配列をメンバに持つオリジナルデータクラス

# AprOriginalDataClass.cpp

// 演算子オーバーロード
BOOL AprOriginalDataClass::operator==(const AprOriginalDataClass& rhs)
{
    for (int nIndex = 0; nIndex < (sizeof(m_nArr) / sizeof(*m_nArr)); nIndex++)
    {
        if (m_nArr[nIndex] != rhs.m_nArr[nIndex])
        {
            return false;
        }
    }
    return true;
}

このように、「このデータクラスを’==’で比較するなら、こうしてね」ってのを実装してやると、エラーは解消する。

※ちなみに、’==’演算子をオーバーロードしたときは’!=’演算子もオーバーロードしておこう。

これマジ。


    • -

もしこの記事を気にいってくれたら、Twitterフォロー・記事ツイートをしていただけると嬉しいです!