1

オブジェクトをベクトルに保持するのに問題があります。演算子で何かをする必要があると思います。

std::vector<Foo> vec;
Foo a = Foo();
vec.push_back(a);

...

if(std::find(vec.begin(), vec.end(), a) < vec.end()) {
    // Found
} else {
    // Not found
}

Foo はコンパイルするために operator== が必要です。私はこれを行います

bool Foo::operator==(const Foo& rhs) {
    return this == &rhs;
}

しかし、私が理解していることからvec.push_back、 は Foo オブジェクトのコピーを作成するため、== は false を返します。

したがって、検索を行うたびに、それは決して見つかりません。

ここで何をするのが正しいですか?ポインターのベクトルへの切り替えを避けたいと思っています。

4

3 に答える 3

2

Foo::operator==ID をチェックする代わりに、Foo のメンバ変数が等しいかどうかを比較するようにの実装を変更します。例えば:

bool Foo::operator==(const Foo& rhs) const {
    return get_a() == rhs.get_a()
        && get_b() == rhs.get_b(); // and so on
}

constメンバー変数を変更してはならずconst、Foo のインスタンスで使用できる必要があるため、これは関数でもあることに注意してください。

于 2012-09-30T07:18:20.333 に答える
1

あなたができることは本当に何もありません.std::vector <>(またはほとんどの標準コンテナ)は挿入時にコピーを作成します。2 つの Foo オブジェクトの等価性がそれらのアドレスが等しいことによって実際に定義されている場合、唯一できることは std::vector<> にポインタを格納することです。std::vector<> にポインターを格納する場合は、代わりに std::shared_ptr<>、std::unique_ptr<> などのスマート ポインターを格納することをお勧めします。

Foo が重すぎてコピーできない場合は、C++11 で Foo Move-only を作成するか、boost::containers::vector と boost::move を使用して C++03 でのみ移動させることができます。

おそらく、代わりに operator==() を変更してメンバー変数を比較する方が簡単です。

于 2012-09-30T07:22:56.617 に答える
1

あなたのoperator==アイデンティティはメモリ内の場所によって定義されることを意味しますが、ベクトルに値を追加し、平等を望んでいるという事実は、アイデンティティが場所によって定義されていないことを示しています。

何らかの理由で他のメンバーに基づく ID 定義がない場合は、一意の識別子を Foo オブジェクトに追加して、コードでその識別子を比較できます。

bool operator==(const Foo &rhs)
{
    return this->m_id == rhs.m_id;
}
于 2012-09-30T07:29:02.690 に答える