是否存在数据结构(在STL或boost中可用),它接受两个参数并将其映射到某个值?
示例包括在坐标网格中返回某些信息或在图表中获取边缘的权重:
coordinate_quadrant(-1,-1)= 3
weight_of(u,v)= 10
象限示例可以在一个带有四个if语句的简单函数中完成。我主要是寻找一个适合重量例子的例子。我试图避免创建边缘类并将其传递给weight_of(边缘)函数。
答案 0 :(得分:11)
你可以使用std :: map< std :: pair< Type1,Type2>,Type3>。
答案 1 :(得分:1)
我会考虑以下选择:
选项1
std :: map with std :: pair< Type1,Type2>作为键,Type3作为值
std::map< std::pair< Type1, Type2 >, Type3 > data;
选项2
2维std :: vector
如果Type1和Type2是整数,您在建模图形或笛卡尔空间时可能会发现: 的std ::矢量&lt;的std ::矢量&lt; Type3&gt; &GT;数据;
选项3
包含Type1和Type2的用户定义类,可以映射到Type3
如果你想要用更多的值来装饰你的两种类型,你可以定义一个包含两种类型的类,并使用std :: map将它映射到第三种类型:
public:
MyClass( Type1 x, Type2 y ) : x_( x ), y_( y )
Type1 x() const {
return x_;
}
Type2 y() const {
return y_;
}
private:
Type1 x_;
Type2 y_;
};
std::map< MyClass, Type3 > data;
选项1的好处在于它非常快速且易于编码,并且应该对知道C ++的任何人都有意义。选项2可能会快一点,并且具有额外的好处,可以轻松修改它以获得更多维度。选项2的缺点是你的值需要是二维向量的整数索引。
在我看来,选项3对我来说是最好的选择,因为它是可读的,对Type1和Type2的类型没有要求,并且可以扩展为以非常合理的方式包含更多数据。选项3的缺点是你需要定义一个StrictWeakOrdering来比较MyClass对象,但这很简单:
bool operator<(const MyClass & rhs) const {
return ( rhs.x() <= x() && rhs.y() <= y() );
}
让它成为你班级的成员,你应该准备好了。
与编程中的许多事情一样,在你考虑你正在做什么以及你愿意投入多少时间之前,没有一个明显的正确答案。不要忘记检查密钥存在和越界错误。 :)
答案 2 :(得分:0)
使用后端的一对整数对象。换句话说,实现map,但是对于这个对象。您不能覆盖operator []以接受多个参数,但您可以覆盖运算符
()在自定义地图类上,所以你可以获得一些语法糖,例如my_map[row](col) = whatever