gpt4 book ai didi

c++ - 制作一个以坐标为键的 std::map

转载 作者:可可西里 更新时间:2023-11-01 18:28:20 24 4
gpt4 key购买 nike

创建一个以坐标为键的 std::map 似乎是不可能的。当两个坐标的 (x+y+z) 相同时, map 将覆盖前一个。示例:

map[Coordinate(1, 0, 0)] = object1;
map[Coordinate(0, 1, 0)] = object2;
map[Coordinate(0, 0, 1)] = object3;

这将导致有一个包含 1 个元素的 std::map,其中包含 object3 作为值和 Coordinate(0, 0, 1) 作为键。我怎样才能防止这种情况发生,以便它包含所有值?

#pragma once

struct Coordinate {
double x, y, z;
Coordinate(double x, double y, double z) : x(x), y(y), z(z) {}

bool operator<(const Coordinate& coord) const {
if(x + y + z < coord.x + coord.y + coord.z)
return true;
return false;
}

bool operator==(const Coordinate& coord) const {
if(x == coord.x && y == coord.y && z == coord.z)
return true;
return false;
}

inline bool isInRange(Coordinate coord, int range) const {
if(pow(coord.x - this->x, 2) + pow(coord.y - this->y, 2) + pow(coord.z - this->z, 2) <= range*range)
return true;
return false;
}
};

最佳答案

« std::map is a sorted associative container that contains key-value pairs with unique keys. Keys are sorted by using the comparison function Compare. » from cppreference

默认的比较函数是 std::less 这将在 Key 上使用运算符 <对象。

因此,问题出在operator<Coordinate :

bool operator<(const Coordinate& coord) const {
if(x + y + z < coord.x + coord.y + coord.z)
return true;
return false;
}

(1, 0, 0) < (0, 1, 0)是假的但是 (0, 1, 0) < (1, 0, 0)也是假的,至于std::map有关,(1, 0, 0) == (0, 1, 0) .

为了使用Coordinate对象作为 std::map 中的键,您需要找到满足您需求的正确的严格弱排序标准(operator<)。

正如其他人所说,您可以使用类似 std::tie 的东西(在 C++11 中)首先比较 x , 然后 y然后 z像这样:

bool operator<(const Coordinate& coord) const {
if(x < coord.x) return true;
if(x > coord.x) return false;
//x == coord.x
if(y < coord.y) return true;
if(y > coord.y) return false;
//x == coord.x && y == coord.y
if(z < coord.z) return true;
if(z > coord.z) return false;
//*this == coord
return false;
}

关于c++ - 制作一个以坐标为键的 std::map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18019975/

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