C++ 如何在向量中找到元素?

C++ 如何在向量中找到元素?,c++,vector,iterator,C++,Vector,Iterator,我将结构坐标定义为 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

我将结构坐标定义为

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;
vectorvoord;
现在我使用下面的代码来获取向量的索引,该向量有一个特定的坐标对象

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;
}
int索引::getVIndex(CoordCRD){
向量::迭代器;
int indx;
it=vcoord.begin();
while(it!=vcoord.end()&((*it)!=crd)
++它;
indx=距离(vcoord.begin(),it);
cerr您的
Coord
struct需要一个not equals运算符才能执行此操作:

(*it) != crd

not equals运算符的逻辑不正确。最好且最简单的选项是提供相等比较并使用:

然后,您可以根据
=
实现
!=
,但如果使用
std::find
,则不需要它,默认情况下使用
=

vector<Coord>::iterator it = std::find(vcoord.begin(), vcoord.end(), crd);
vector::iterator it=std::find(vcoord.begin(),vcoord.end(),crd);
要做到这一点,您的
坐标结构需要一个not equals运算符:

(*it) != crd

not equals运算符的逻辑不正确。最好且最简单的选项是提供相等比较并使用:

然后,您可以根据
=
实现
!=
,但如果使用
std::find
,则不需要它,默认情况下使用
=

vector<Coord>::iterator it = std::find(vcoord.begin(), vcoord.end(), crd);
vector::iterator it=std::find(vcoord.begin(),vcoord.end(),crd);

您错误地实现了不等式运算符中的逻辑。 应该是

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;

您错误地实现了不等式运算符中的逻辑。 应该是

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;

只有当所有坐标不同时,您的
!=
运算符才会返回
true
;如果任何坐标不同,则应返回
true
。这意味着如果第一个元素的任何坐标与函数参数的坐标匹配,则函数将返回零

你的版本是一种冗长的写作方式:

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);
}

只有当所有坐标不同时,您的
!=
运算符才会返回
true
;如果任何坐标不同,则应返回
true
。这意味着如果第一个元素的任何坐标与函数参数的坐标匹配,则函数将返回零

你的版本是一种冗长的写作方式:

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);
}

您在
vcoord
中输入了什么值,您将什么值传递给
getVIndex
?如何定义
操作符!=
用于
Coord
?更好的是,您能发布一个小的完整程序来演示问题吗?是的,它编译并执行了,indx始终为0。索引始终为零,因为将任何元素放入
vcoord
中。Mankarse:调用此函数之前已填充代码段vcoord请参阅上面Mike的评论…发布复制错误的工作代码。它将帮助您快速获得帮助您在
vcoord
中输入了哪些值,以及您将传递给
getVIndex
的值是什么?我如何s
操作符!=
坐标定义的?更好的是,你能发布一个小的完整的程序来演示这个问题吗?是的,它编译并执行了,indx始终为0。索引始终为零,因为你从未将任何元素放入
vcoord
中。Mankarse:这是代码片段vcoord在cal之前填充的ling此函数请参见上面Mike的评论…发布复制错误的工作代码。这将使您更快地获得帮助。如果您因为出现错误而放弃,这就是您的评论所暗示的?您是否因为出现错误而放弃,这就是您的评论所暗示的?感谢大家指出我的错误并帮助我解决问题,现在find正在工作fine和我使用的是相同的。感谢大家指出我的错误并帮助我解决问题,现在find工作正常,我使用的是相同的。