4

我有一个 3 分量向量结构Vector3,用 3int表示 X、Y 和 Z。对于每个 3D 点(我有或多或少 200-300 个不同的 3D 点)我有一个string.

我想要做的是有一个数据结构来检查string该位置是否存在。我想使用 astd::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";
}
4

2 回答 2

5

您有两种选择:

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

1.<运营商

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 ;
}

2.比较功能

class Vector3Comparator {
    public:
    bool operator () (const Vector3 &a,const Vector3 &b) const {
        if( a.x != b.x )
            return a.x < b.x ;
        else if( a.y != b.y )
            return a.y < b.y ;
        else if( a.z != b.z )
            return a.z < b.z ;
        else
            return false ;
    }
}
...
static std::map<Vector3,string,Vector3Comparator> generatedBorders;
于 2013-08-27T05:01:43.397 回答
2

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

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;
于 2013-08-27T05:01:03.513 回答