数据结构类似于2参数映射

时间:2009-07-13 01:35:37

标签: c++ data-structures

是否存在数据结构(在STL或boost中可用),它接受两个参数并将其映射到某个值?

示例包括在坐标网格中返回某些信息或在图表中获取边缘的权重:

  

coordinate_quadrant(-1,-1)= 3

     

weight_of(u,v)= 10

象限示例可以在一个带有四个if语句的简单函数中完成。我主要是寻找一个适合重量例子的例子。我试图避免创建边缘类并将其传递给weight_of(边缘)函数。

3 个答案:

答案 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