sort error

monarch_dodra monarchdodra at gmail.com
Sat Jun 29 07:52:06 PDT 2013


On Saturday, 29 June 2013 at 14:20:05 UTC, Ali Çehreli wrote:
> Not knowing whether it applies to your case, the following is 
> one almost correct way of writing opCmp:
>
>     int opCmp(ref const Vector3D vec) {
>         return cast(int)(x != vec.x
>                          ? x - vec.x
>                          : (y != vec.y
>                             ? y - vec.y
>                             : z - vec.z));
>     }
>
> Ali

This is the closes thing to what the OP wrote, but it is a *very* 
(IMO) strange way to sort 3D elements.

In basic English, it's:
Whoever has the smallest X, or, if tied,
Whoever has the smallest Y, or, if tied,
Whoever has the smallest Z

OP: Is this how you wanted to sort?

This is strange to me because ordering is (usually) tied to a 
norm, where basically, opCmp returns whoever has the smallest 
norm. Yet this ordering isn't really tied to any norm.

OP: Can you confirm how you want to sort? Usually, 3DVector are 
sorted using any of Euclidian, Manhatan, Maximum or Minimum norm:
https://en.wikipedia.org/wiki/Norm_(mathematics)#Examples

If you can define a "norm" function, then opCmp becomes:
--------
int opCmp(in Vector3D iRhs)
{
     auto nLhs = this.norm();
     auto nRhs = iRhs.norm();
     return (nLhs > nRhs) - (nLhs < nRhs);
}
--------

This is standard "boilerplate" opCmp. It avoids branching too.


More information about the Digitalmars-d-learn mailing list