2011-04-18 93 views
1

我想从STL中使用排序功能,但它在执行过程中给我一个错误。功能排序错误

我比较功能,如果v是小然后按e返回true:

bool smallerThan(VertexEntry &v, VertexEntry &e) { 
    if(v.v[0] < e.v[0]) return true; 
    else if(v.v[1] < e.v[1]) return true; 
    else if(v.v[2] < e.v[2]) return true; 
    return false; 
} 

,这里是电话:

sort(vertices.begin(),vertices.end(),smallerThan); 

向量的大小是aprox的400元。

有人能帮我解决我的问题吗? 谢谢!

+0

或许,如果你张贴的错误,我们可以提供帮助。 – 2011-04-18 16:37:30

+0

什么是错误? – 2011-04-18 16:37:38

+0

你得到了哪一个确切的错误? – ulidtko 2011-04-18 16:38:16

回答

9

您的比较函数是不正确的 - 它不强制执行严格的弱排序。

使用此:

bool smallerThan(VertexEntry const & v, VertexEntry const & e) { 
    if (v.v[0] < e.v[0]) 
    return true; 
    else if(v.v[0] > e.v[0]) 
    return false; 
    else if(v.v[1] < e.v[1]) 
    return true; 
    else if(v.v[1] > e.v[1]) 
    return false; 
    else if(v.v[2] < e.v[2]) 
    return true; 
    return false; 
} 
+1

最好避免使用'>'运算符,因为当<<'时它通常不会被重载。 – Potatoswatter 2011-04-18 16:38:33

+2

@Patatoswatter:我认为最好是实现你所需要的操作符,或许是'operator <'。对于一个模板肯定,对于一个特定的类,我更喜欢上述。 – Erik 2011-04-18 16:40:14

+0

@ybungalobill,@Erik:每次实施所有操作员都很方便,但这是一项不切实际的工作。如果你真的这么做了,那么给你更多的权力。在这种情况下,'operator>'不是*必需的*。 – Potatoswatter 2011-04-18 16:44:25

2

您的比较操作人员不严格执行弱序。如果你能够使用提升技巧,我所看到的就是将你的对象绑定到boost::tuple并使用它的严格弱operator<

如果你需要自己编写,这样的事情应该工作:

bool smallerThan(const VertexEntry &v, const VertexEntry &e) 
{ 
    if(v.v[0] != e.v[0]) return v.v[0] < e.v[0]; 
    else if(v.v[1] != e.v[1]) return v.v[1] != e.v[1]; 
    else return v.v[2] < e.v[2]; 
}