2

STLセットで検索と消去を使用して理解するのに問題があります。私はこれを持っています:

struct NotMemberFound : exception {};

class FriendGroup
{
private:
    set<Person, ClassComp> members;
public:
    FriendGroup(): {}

    virtual void add_member(const Person& person)
    {
        members.insert(person);
        n_members = members.size();
    }

    virtual void remove_member(const Person& person)
    {
        const set<Person, ClassComp>::iterator it = members.find(person);

        if (it == members.end())
            throw NotMemberFound();
        else
        {
            members.erase(it);
        }
    }
}

人には1つの属性(文字列名)と、彼の唯一の属性を返すmetod get_name()があります。そして、ClassCompは次のように定義します。

struct ClassComp
{
    bool operator() (const Person& a, const Person& b) const
    {
        return a.get_name() != b.get_name();
    }
};

さて、私がこのようにそれを使おうとしているとき:

int main(void)
{
    Person messi("Messi");
    Person xavi("Xavi");
    Person iniesta("Iniesta");

    FriendGroup barcelona;

    barcelona.add_member(messi);
    barcelona.add_member(xavi);
    barcelona.add_member(iniesta);

    barcelona.remove_member(iniesta);

    return 0;
}

最後の要素を追加してremove_memberを呼び出すと、プログラムは例外(NotMemberFound)をスローします。しかし、他のメンバーを消去しようとしても、この問題は発生しません。

私のコードの何が問題になっていますか?

//ひどい英語でごめんなさい:S //

4

1 に答える 1

5

あなたのコンパレーターは

struct ClassComp {
    bool operator() (const Person& a, const Person& b) const {
        return a.get_name() < b.get_name();
    }
};

コンパレータは、要素が別の要素より劣っているかどうかを示す必要があります。あなたの場合、それはあなたがあれやこれに言ったようなstd::setものmessi < xaviですxavi < messi。要素を探すとき、要素がソートされていると想定し、二分探索を使用して探すため、要素を見つけることができません。

于 2012-11-24T19:42:26.540 に答える