C++ 对象的快速排序向量

c++ quicksort vector of objects

我在我的对象矢量上使用 std::qsort 时遇到问题。 (注意这段代码在一个循环内)

std::vector<s_GridData> info = GetAllAdjacentObjInfoFromMap(FLOOR_OBJ, e_Object::eObject_WIRE, itr.getPos());

//No wires adjacent!
if (info.size() == 0) {
  continue;
}

std::cout << "Before sorting: ";
std::cout << info;

std::qsort(&info, info.size(), sizeof(s_GridData),
  [](const void *lhs, const void *rhs)->int {
    s_GridData gridLhs = *reinterpret_cast<const s_GridData*>(lhs);
    s_GridData gridRhs = *reinterpret_cast<const s_GridData*>(rhs);
    if (gridLhs.groupID < gridRhs.groupID) return -1;
    if (gridRhs.groupID < gridLhs.groupID) return 1;
    return 0;
  }
);

std::cout << "After sorting: ";
std::cout << info;

这里具体在quicksort的代码里,好像quicksort在抹杀我的info。 lambda有问题吗?或者是否有使用 qsort 的另一个要求,如赋值运算符重载。然而 s_GridData 只是一个整数值的结构。

提前致谢。

您向 qsort() 传递了错误的参数(这实际上是一个最初不在 namespace std 中的 C 函数):

std::qsort(&info, ...

马上就错了,因为 info 是一个 std::vectorqsort() 需要一个 C 风格的数组。您可以这样修复它:

std::qsort(info.data(), ...

或在 C++11 之前:

std::qsort(&info[0], ...

但是,更好的解决方案是使用 std::sort(),这是一个 真正的 C++ 函数,提供类型安全和其他好处。它是这样的:

sort(info.begin(), info.end(),
    [](const s_GridData& lhs, const s_GridData& rhs)->bool {
        return gridLhs.groupID < gridRhs.groupID;
    });

如您所见,C++ 方式更简洁,如果您的顺序适用于所有实例,您可以单独定义它(通常作为内联自由函数),在这种情况下:

sort(info.begin(), info.end());