使用std :: map的两个键的最佳方法是什么?

Rol*_*ien 43 c++ stl

我有一个std :: map,我用它来存储x和y坐标的值.我的数据非常稀疏,所以我不想使用数组或向量,这会导致大量的内存浪费.我的数据范围从-250000到250000,但我最多只有几千点.

目前我正在使用两个坐标(即"12x45")创建一个std :: string并将其用作键.这似乎不是最好的方法.

我的其他想法是使用int64并将两个int32推入其中并将其用作密钥.

或者使用具有两个坐标的类.对要用作密钥的类有什么要求?

做这个的最好方式是什么?我宁愿不使用地图地图.

Dav*_*man 115

使用std :: pair <int32,int32>作为密钥:

std::map<std::pair<int,int>, int> myMap;

myMap[std::make_pair(10,20)] = 25;
std::cout << myMap[std::make_pair(10,20)] << std::endl;
Run Code Online (Sandbox Code Playgroud)

  • 一对工作,但是通用的.定义一个自定义类型可能是一个好主意,该类型表示该对真正意味着什么,笛卡尔坐标或其他什么. (5认同)
  • @ bames53主要的问题是你必须为新类型实现一个比较运算符,如果你想要确保的只是唯一性,这可能没有意义. (2认同)

Sta*_*ked 32

我通常会解决这样的问题:

struct Point {
    int x;
    int y;
};

inline bool operator<(const Point& p1, const Point& p2) {
    if (p1.x != p2.x) {
        return p1.x < p2.x;
    } else {
        return p1.y < p2.y;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这很明确,很好.请注意,这与`typedef std :: pair <int,int> Point;`相同 (9认同)
  • 嘿,直到现在我还不知道std :: pair有operator <defined.爱你! (9认同)
  • @GManNickG除了`x`和`y`的接口,它是`std :: pair`的`first`和`second`. (4认同)
  • 这非常好,因为它也可以用于包含两个以上字段的键。 (2认同)

Dea*_*ead 6

Boost具有一个使用一个或多个索引的地图容器。

多索引图


Chr*_*isW 5

对要用作密钥的类有什么要求?

映射需要能够判断一个键的值是否小于另一个键的值:默认情况下,这意味着(key1 <key2)必须是有效的布尔表达式,即键类型应该实现'小于'运算符.

map模板还实现了一个重载的构造函数,它允许你传入一个key_compare类型的函数对象的引用,它可以实现比较运算符:这样,或者比较可以实现为这个外部函数对象的方法,而不是需要被烘焙到你的钥匙的任何类型.