我在对我的对象 vector 使用 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;
这里特别是在快速排序代码中,似乎快速排序正在删除我的信息
。
lambda有问题吗?或者是否有使用 qsort 的另一个要求,如赋值运算符重载。然而,s_GridData
只是一个整数值结构。
提前致谢。
最佳答案
您向 qsort()
传递了错误的参数(这实际上是一个最初不在 namespace std
中的 C 函数):
std::qsort(&info, ...
马上就错了,因为 info
是一个 std::vector
但 qsort()
需要一个 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());
关于C++ 对象的快速排序 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28832220/