C++ 如果Y值为1,则即使X值为0,std::map中的sf::Vector2i作为键也显示为(1,1)

C++ 如果Y值为1,则即使X值为0,std::map中的sf::Vector2i作为键也显示为(1,1),c++,sfml,C++,Sfml,我试图在我的程序中使用sf::Vector2i作为平铺贴图的键。正如我在标题中所写的,无论X值是什么,它都将在地图中只显示X和Y的Y值 下面是调试器的图像,它显示了我的意思: 如您所见,键值如下:[0][0],[1][1],[2][2],[3][3]等,而实际值是我期望的值(0,0-0,1-0,2-0,3等) 地图的声明: std::map tileMap; 键(sf::Vector2i)是平铺位置,值对中的sf::Vector2f是实际位置(因此平铺映射[0,1]。首先是0,32,因为平铺

我试图在我的程序中使用sf::Vector2i作为平铺贴图的键。正如我在标题中所写的,无论X值是什么,它都将在地图中只显示X和Y的Y值

下面是调试器的图像,它显示了我的意思:

如您所见,键值如下:[0][0],[1][1],[2][2],[3][3]等,而实际值是我期望的值(0,0-0,1-0,2-0,3等)

地图的声明:

std::map tileMap;
键(sf::Vector2i)是平铺位置,值对中的sf::Vector2f是实际位置(因此平铺映射[0,1]。首先是0,32,因为平铺之间的间距为32)

以下是填充地图的循环:

intxpos{0},yPos{0};
对于(inti{0};i
地图比较器:

结构向量比较器 { 布尔运算符()(sf::Vector2i lhs,sf::Vector2i rhs)常量 { 返回lhs.x+lhs.y 知道这是怎么回事吗?为什么值是正确的,而键没有反映这一点,这对我来说毫无意义

编辑:

如果我像这样手动添加互动程序:

tileMap[sf::Vector2i(0,5)]。first=sf::Vector2f(50,50);

如果先添加该条目,则该条目的键也将为[0][0]。如果我一个接一个地添加它,它将是[1][1],依此类推。似乎键值不关心sf::Vector2i的内容?

您的比较运算符是错误的

你们比较两点的曼哈顿距离,这是错误的。0,1点和1,0点具有相同的距离(0+1==1+0),因此tileMap中只存在一个(后面的一个)

试试这个:

struct VectorComparator
{
    bool operator() (sf::Vector2i lhs, sf::Vector2i rhs) const
    {
        return lhs.x < rhs.x || (lhs.x == rhs.x && lhs.y < rhs.y);
    }
};
结构向量比较器 { 布尔运算符()(sf::Vector2i lhs,sf::Vector2i rhs)常量 { 返回lhs.x 编辑:
作为一个次要建议,我将使用std::vector而不是std::list(在几乎所有情况下都会更快,除非您真的需要有指向始终有效的元素的指针)。我还将使用std::unordered_map而不是std::map(再一次,更快)。

看起来我的比较器关闭了!你的解决方案解决了这个问题。我会记住你关于矢量和无序地图的建议,谢谢!我会尽快接受你的答案:)编辑:另外,关于我上次的编辑,即使它工作,它仍然显示好像它是错误的,但它真的不是。即使调试器说它不是正确的,该键也是正确的!