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::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());
我在我的对象矢量上使用 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::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());