我试图创建一个std :: GLM向量集(特别是glm :: vec3)。由于C ++不知道如何执行<对向量的操作,我必须传入一个比较功能。
我可以通过创建这样的结构来编写自己的结构:
struct compareVec
{
bool operator() (const glm::vec3& lhs, const glm::vec3& rhs) const
{
return lhs.x < rhs.x && lhs.y < rhs.y && lhs.z < rhs.z;
}
};
std::set< glm::vec3, compareVec > myset;
但是,我确定GLM包含他们自己的矢量比较函数。
我找到了以下资源,但我不确定如何使用它: https://glm.g-truc.net/0.9.4/api/a00137.html
如何将其中一个比较函数传递给我的集合?
答案 0 :(得分:2)
好的,差不多了! glm :: lessThan返回一个矢量类型,而不是bool。这就是你的比较器无法工作的原因。您可以使用glm::all
来获取bool。来自glm::all
bool glm :: all(vecType&lt; bool&gt; const&amp; v)
如果x的所有组件都为真,则返回true。
模板参数 vecType布尔向量类型。
如果这对你有意义,你必须自己决定,即使我建议不要这样做,据我所知,这将导致以下问题:
Consider:
lhs = (1,2,3)
rhs = (0,1,4)
Than:
lhs < rhs ==> false, since lhs.x and lhs.y are larger than the corresponding components of rhs
rhs < lhs ==> false, since rhs.z component is larger than lhs.z
由于两个向量都不能被排序为较少,这意味着它们是相等的。我怀疑这是你的想法(我已经警告过你了)。
如果您仍然决定使用它,这是在MSVC2010上测试的最小工作示例:
#include <set>
#include <glm/vec3.hpp>
#include <glm/detail/func_vector_relational.hpp>
struct compareVec
{
bool operator() (const glm::vec3& lhs, const glm::vec3& rhs) const
{
return glm::all(glm::lessThan(lhs, rhs));
}
};
int main()
{
std::set<glm::vec3, compareVec> myset;
return 0;
}
也许这有帮助。