C++ 对象的快速排序 vector

标签 c++ vector struct lambda qsort

我在对我的对象 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::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());

关于C++ 对象的快速排序 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28832220/

相关文章:

c++ - g++ 错误 : stray '\177' in program

java - 仅使用一种方法使用 fastSort 对整数 vector 进行排序(无需 Medianof3 或分区方法,如经典实现)

c - 难以理解 C 中的结构

python - 结构打包/拆包类设计

c - C 结构填充是否使这种使用不安全?

c++ - OSX 中的 Mongodb connect() 段错误

c++ - vector.push() 和 vector.reserve() 上的 bad_alloc

c++ - 20 个问题游戏 - Switch 语句

c++ - 在 C++ 中实现 crank-nicolson

c++ - 调整结构的 vector 元素大小 - segv