0

我已将结构 Coord 定义为

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

重载运算符!= 用于坐标

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 回答