gpt4 book ai didi

不同类的 C++ Map<>.find() 重载

转载 作者:太空狗 更新时间:2023-10-29 19:43:57 34 4
gpt4 key购买 nike

我尝试使用定义为的 map :

    map<Vertex,unsigned int> _addedVertices; 

现在当我使用 find 函数检查一个顶点是否已经在里面时我用不同的信息得到一个指向错误顶点的迭代器,所以我尝试了以下操作:

    map<Vertex,unsigned int,cmpByVertexFields> _addedVertices; 

这没有帮助。

我在 Vertex 类中还有以下重载函数。

    bool operator<(const Vertex &otherV)const{
return(_x<otherV._x && _y<otherV._y && _z<otherV._z);
}
bool operator==(const Vertex &otherV)const{
return _x==otherV._x && _y==otherV._y && _z==otherV._z;
}

但没有任何作用。例子:我插入了一个包含 (0.2,0.1,0.4) 的顶点接下来我使用的是 (0.2,0.15,0.41) 的查找函数我得到的迭代器是第一个顶点而不是 map.end()。

我忘了定义什么?谢谢

编辑:cmpByVertexFields:

struct cmpByVertexFields {
bool operator()(const Vertex& a, const Vertex& b) const {
return a.getX()==b.getX() &&
a.getY()==b.getY() &&
a.getZ()==b.getZ();
}
};

最佳答案

这是你的罪魁祸首

bool operator<(const Vertex &otherV)const{
return(_x<otherV._x && _y<otherV._y && _z<otherV._z);
}

这不会产生 strict weak ordering .

你需要这样的东西

bool operator<(const Vertex &otherV)const{
if(_x != otherV.x)
return _x < otherV.x;
if(_y != otherV.y)
return _y < otherV.y;
return _z < otherV.z;
}

或者,等效且更方便的是,使用 std::tie 将它们作为元组进行比较

bool operator<(const Vertex &otherV)const{
return std::tie(x_, y_, z_) < std::tie(OtherV.x_, OtherV.y_, OtherV.z_);
}

关于不同类的 C++ Map<>.find() 重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17761892/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com