0

構造Coordを次のように定義しました

struct Coord { 
int x;
int y;
int z; 
};

Coord のオーバーロードされた operator!=

bool Coord::operator !=(Coord& crd)const {
if(this->x != crd.x)
{
    if(this->y != crd.y)
    {
        if(this->z != crd.z)
            return true;
        else
            return false;
    }
    else
        return false;
    return true;
}
else
    return false;
}

次に、ベクトル変数を次のように初期化しました

vector<Coord> vcoord;

現在、次のコードを使用して、特定の Coord オブジェクトを持つベクトルのインデックスを取得しています

int Index::getVIndex(Coord crd) { 
vector<Coord>::iterator it;
int indx;

it = vcoord.begin();
while(it != vcoord.end() && (*it) != crd)
    ++it;

indx = distance(vcoord.begin(),it);
cerr << (*it).x << " " << (*it).y << " " << indx << endl;
return indx;
}

しかし、indx の値は常に 0 です。正しい結果を得るために親切に助けてください。

4

3 に答える 3

3

Coordこれを行うには、構造体に不等号演算子が必要です。

(*it) != crd

不等号演算子のロジックが正しくありません。最良かつ最も簡単なオプションは、等値比較を提供して使用することstd::findです。

struct Coord { 
int x;
int y;
int z; 
};

bool operator == (const Coord& lhs, const Coord& rhs)
{
  return lhs.x==rhs.x && lhs.y==rhs.y && lhs.z==rhs.z;
}

!=その後、 の観点から実装できますが、デフォルトで使用==する を使用する場合は必要ありません。std::find==

vector<Coord>::iterator it = std::find(vcoord.begin(), vcoord.end(), crd);
于 2012-10-29T12:44:30.537 に答える
2

オペレーターは、すべての座標が異なる場合にのみ!=戻ります。異なる場合は返されます。これは、最初の要素の座標が関数の引数の座標と一致する場合、関数はゼロを返すことを意味します。truetrue

あなたのバージョンは、長々とした書き方です:

return x != crd.x && y != crd.y && z != crd.z;

それがいつあるべきか:

return x != crd.x || y != crd.y || z != crd.z;

次のように実装することで、ロジックを正しくするのが簡単になる場合があります==

bool operator==(Coord const & lhs, Coord const & rhs) {
    return lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z;
}
bool operator!=(Coord const & lhs, Coord const & rhs) {
    return !(lhs == rhs);
}

また、 の定義があれば、独自のループをローリングするのではなく、次の==ように使用できます。std::find

auto found == std::find(vcoord.begin(), vcoord.end(), crd);
if (found == vcoord.end()) {
    // Decide what to do if not found.
    // Returning zero is a bad idea, since there's no way distinguish that 
    // from a successful outcome.
} else {
    return std::distance(vcoord.begin(), found);
}
于 2012-10-29T12:57:59.203 に答える
1

不等式演算子のロジックを誤って実装しました。そのはず

bool Coord::operator !=(const Coord& crd)const {
  return x != crd.x || y != crd.y || z != crz.z;
}

あなたの実装は論理的に同等です

  return x != crd.x && y != crd.y && z != crz.z;
于 2012-10-29T12:54:11.103 に答える