C++ 在qsort之后标识项/类指针

C++ 在qsort之后标识项/类指针,c++,pointers,struct,qsort,C++,Pointers,Struct,Qsort,第一个问题,请原谅我的天真 我跳入C++的三角测量库,在运行三角测量方法之前,对结构指针数组进行排序。我试图在整个应用程序中跟踪一个特定的结构指针(XYZ),它会根据鼠标位置进行更新。问题是,无论何时应用qsort方法,该指针都会更改。如何识别或跟踪此结构XYZ指针 这是结构和排序 struct XYZ{ double x, y, z; }; int XYZCompare(const void *v1, const void *v2){ XYZ *p1, *p2; p1 = (X

第一个问题,请原谅我的天真

我跳入C++的三角测量库,在运行三角测量方法之前,对结构指针数组进行排序。我试图在整个应用程序中跟踪一个特定的结构指针(XYZ),它会根据鼠标位置进行更新。问题是,无论何时应用qsort方法,该指针都会更改。如何识别或跟踪此结构XYZ指针

这是结构和排序

struct XYZ{
  double x, y, z;
};

int XYZCompare(const void *v1, const void *v2){
  XYZ *p1, *p2;

  p1 = (XYZ*)v1;
  p2 = (XYZ*)v2;
  if(p1->x < p2->x)
    return(-1);
  else if(p1->x > p2->x)
         return(1);
       else
         return(0);
}
排序和更新鼠标方法

mousePointer->x = mouseX;
mousePointer->y = mouseY;

// If I don't qsort here the reference is fine, but I need to.
qsort(allPointers, 2, sizeof(XYZ), XYZCompare); 
// triangulate, etc

qsort()的第三个参数不应该是size(XYZ*)?您正在对指针进行排序,而不是对指向的对象进行排序。

您有两个选项:

  • 您可以在排序后搜索您的唯一条目。如果添加标记成员,请线性搜索该标记。如果任何具有匹配X/Y坐标的条目与任何其他条目一样好,则可以在排序数组中搜索该条目。您可以使用
    b搜索
    组合这些坐标,以找到右侧
    X
    坐标,然后(较短)线性搜索标记
  • 您可以添加一个间接层。不要对数组中的
    XYZ
    结构进行排序,而是创建一个索引或指针的并行列表,并对
    XYZ*
    int
    引用进行排序。您的
    mousePointer
    引用将保持有效

该死,这几乎奏效了,但却打乱了三角测量的顺序。我尽量不改变原来的三角测量方法。无论如何,谢谢。如果你真的在使用
c++
,而不是
c
,通常使用
std::sort
from
qsort
更好(即更快)。由于
std::sort
是一个模板函数,它知道要排序的数组的数据类型,因此可以更有效地执行操作。
mousePointer->x = mouseX;
mousePointer->y = mouseY;

// If I don't qsort here the reference is fine, but I need to.
qsort(allPointers, 2, sizeof(XYZ), XYZCompare); 
// triangulate, etc