我有一个名为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";
}
答案 0 :(得分:5)
您有两种选择:
<
的{{1}}运算符或Vector3
的函数,并在声明地图时指定它。当没有自然(直观,常见,默认等)排序作为键的类,或者您想要按照不同于它的标准排序/映射时,这个特别有用。恕我直言,第一个就是你的例子,所以我会倾向于它。Vector3
运营商<
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;