2

私は私が愚かであることを理解していますので、私に優しくしてください。はい、これは課題ですが、答えだけでなく、何が間違っているのかを理解したいです。

BSTIterator クラス テンプレートの二分探索ツリーのイテレータに対して、operator== および operator!= 関数を記述しようとしています。

与えられた (すべて同じクラス テンプレート内):

private: 

BSTNode<Data>* curr;

...

bool operator==(BSTIterator<Data> const & other) const {
  (here's where I do my magic)
}

operator!= も同じ設定です。

== のために書きます ...

  return (&curr == other);

かっこは必要ないと思いますが、とにかく...これが私が持っているものです!=

  return !(&curr == other);

私のコンパイラには != の問題がありますが、明らかに == ではありません。

それはたくさんのぐちゃぐちゃなグークを吐き出しましたが、私が知る限り、関連する部分は次のとおりです。

「&((const BSTIterator*)this)->BSTIterator::curr != other」の「operator!=」に一致するものはありません

そして、それは言う行を参照しますreturn !(&curr == other);

最初は、コンパイラも私の operator== 関数を気に入らなかったと思いますが、今では参照されていません。を除いて基本的に同じであるのに、なぜ一方が好きで他方が好きではないの!ですか?

さらに情報を含める必要がある場合はお知らせください。

4

2 に答える 2

4

あなたのコードからわかるようにcurr、イテレータが指す位置を示します。イテレータのインスタンスを別のインスタンスと比較するときは、両方が同じ場所を指しているかどうかを確認する必要があります。私は正しいですか?答えが true の場合、次のようにコーディングしないでください。

bool operator==( BSTIterator<Data> const & other) const {
    return this->curr == other.curr;
}
bool operator!=( BSTIterator<Data> const & other) const {
    return this->curr != other.curr;
}

そして、あなたのエラーについて:あなたのコンパイラは、それをあなたの iterator( )のインスタンスと比較する方法がわからない&curtype( ) であると言っています。そのような操作ですよね?BSTNode<Data>**BSTIterator<Data>==!=

于 2012-10-09T19:11:20.603 に答える
1

最初に、操作のセマンティクスを決定します。参照セマンティクス (反復子はコンテナー内の要素への参照を表す) を持つクラスの場合、等価性の一般的な定義は、まったく同じオブジェクトを参照することです。概念的には、it1 == it2iff (アクセスされるオブジェクトのアドレスが同じ*&*it1 == &*it2である場合、両方の反復子は同じです)。operator*

その後、テストを実行するだけです。あなたの場合、ツリー内のノードへのポインターがある場合、イテレーター内に格納されているポインターが同じノードを参照している場合、2 つのイテレーターは同じです。つまり、格納されているポインターが同じ場合です。

この場合、ポインターを値で比較することに注意してください。2 つのポインターは、格納されている値が同じ場合は同じであるため、アドレス演算子 (1) は使用しません。

return (&curr == other);
        ^        ^
        1        2

また、(2) そのコード行では、おそらく意味をなさないcurr反復子とポインターを比較していることにも注意してください。保存されている両方のポインターotherを比較したい。

于 2012-10-09T19:12:09.527 に答える