我正在尝试使用lambda编写自定义排序函数,并使用std::sort
对一个动态分配的二维数组进行排序。程序启动时确定了一个整数值numFaces
,在程序生命周期内不会改变。这是我的当前方法。
float(*data)[24] = new float[numFaces][24];
std::sort(data, data + numFaces, [](float (&A)[24], float (&B)[24]) -> bool
{
return comparison(A, B); // Pseudo
});
该程序出现以下错误无法编译:
由于我在lambda声明中指定参数应为引用,所以我不明白为什么编译器会产生这个错误消息。我正在使用Microsoft的Visual Studio Community Edition 2015中的VC++编译器。这里是整个日志的快速pastebin。数组类型'float [24]'不可分配
第38行是lambda函数声明的闭合括号。
我知道我可以用几种不同的方法解决这个问题,但如果有一种方法可以使其工作,我希望继续像这样进行。如果您对另一种解决方案有建议,可以让数据按这些组的28个浮点数存储并排序,我将非常高兴听到这一点。
我可以解决当前问题的方式,这将引入其他问题和/或更大的应用程序延迟:
- 使用具有void指针的qsort,将它们强制转换并以基本相同的方式进行排序。我有点不确定是否会在std::sort没有关于容器的所有信息时引入任何延迟,如果我使用std::vectors。
- 使用嵌套的std::vectors进行std::sort。数据不总是存储在内存上,这反过来会强制我每次对向量进行排序时创建数据的副本。我测试了这一点,并使用VS调试器检查了内存位置,但我不确定是否可以通过某种方式解决。
- 使用具有所需数据的自定义类/结构的std::vector。如果没有简单的解决方案来解决我的问题,我将执行此操作或在没有任何STL调用的情况下进行排序。
快速回顾问题及其解决方案:
std::sort
通过分配一个元素到另一个元素重新排列您正在排序的任何内容的元素。由于这个原因,元素必须是可分配的,而C风格的数组根本不是。有许多方法可以解决这个问题,但如果您需要数据在内存上连续存储,则需要一个准确包含数组将要包含的数据的类型;没有更多,也没有更少。正如评论中的人们指出的那样,std::array
是完美的类型。以下是示例解决方案:#include <vector>
#include <array>
std::vector<std::array<float, 24>> data;
使用以下 std::sort
调用:
std::sort(data.begin(), data.end(), [](const std::array<float, 24> &A, const std::array<float, 24> &B) -> bool
{
return A[0] < B[0]; // Sample sort condition
});
std::array
的人减1分 :) (说真的,请查看std::array
,它是与上述结构相比更通用和完整的实现) - mkalstd::array
中是连续存储的,但您确定它没有比那更多的数据吗?如果除了数组之外还有其他东西,数据将不再打包在外部向量中,并且指向向量中第一个浮点数的指针将无法读取数据。我在OpenGL中使用这个功能方便地将浮点数加载到缓冲区中。 - Hooderstd::array
中除了数据之外没有其他对象。”(http://en.cppreference.com/w/cpp/container/array)。如果你遇到了错误,那么你肯定犯了一些错误。`std::array`的接口是`faceData`的超集。 - mkalstd::array
无法正常工作,但这次我写出来就可以了。我已经更新了示例解决方案以使用std::array
,并且它以完全相同的速度运行,并带来了std::array
类所带来的所有附加好处。 - Hooder