3键在C ++中排序地图

时间:2013-08-27 04:51:22

标签: c++

我有一个名为Vector3的3分量矢量结构,其中3 int代表X,Y和Z.对于每个3D点(我有或多或少200-300个不同的3D点),我有一个string

我想要做的是建立一个数据结构,检查该位置是否有string。我想使用std::map并且我创建了这个代码没有很好的结果:

它的错误在于它只运行else部分一次,并且一遍又一遍地返回相同的string

我的Vector3课程是Ogre3D中的课程:http://www.ogre3d.org/docs/api/html/classOgre_1_1Vector3.html

String WorldGenerator::createPlatformBorder(Vector3 size)
{
    static std::map<Vector3, String> generatedBorders;

    if (generatedBorders.find(size) != generatedBorders.end())
    {
        return generatedBorders[size];
    }
    else
    {
        String blockName = requestNewPlatformBorderName();
        generatedBorders.insert(std::pair<Vector3, String>(size, blockName));
        // some logic
        return blockName;
    }
}

请问你帮我吗?

请注意,函数requestNewPlatformBorderName()完全正常,因此错误不存在。这是代码:

String requestNewPlatformBorderName()
{
    static int counter = 0;
    return StringConverter::toString(++counter) + "-platform-border";
}

2 个答案:

答案 0 :(得分:5)

您有两种选择:

  1. 定义班级<的{​​{1}}运算符或
  2. 创建一个比较2 Vector3的函数,并在声明地图时指定它。当没有自然(直观,常见,默认等)排序作为键的类,或者您想要按照不同于它的标准排序/映射时,这个特别有用。恕我直言,第一个就是你的例子,所以我会倾向于它。
  3. 1。 Vector3运营商

    <

    2。比较功能

    bool operator < (const Vector3 &that) const {
        if( this.x != that.x )
            return this.x < that.x ;
        else if( this.y != that.y )
            return this.y < that.y ;
        else if( this.z != that.z )
            return this.z < that.z ;
        else
            return false ;
    }
    

答案 1 :(得分:2)

Vector3运算符&lt;不适合在地图中使用。您需要定义自己的自定义版本。

struct Vector3Cmp
{
    bool operator()(const Vector3& v1, const Vector3& v2)
    {
        if (v1.x < v2.x)
            return true;
        if (v1.x > v2.x)
            return false;
        if (v1.y < v2.y)
            return true;
        if (v1.y > v2.y)
            return false;
        if (v1.z < v2.z)
            return true;
        if (v1.z > v2.z)
            return false;
        return false;
    }
};

static std::map<Vector3, string, Vector3Cmp> generatedBorders;