使用winapi中的lambda函数对向量进行排序

时间:2016-06-01 17:54:01

标签: c++ sorting winapi lambda bitmap

我'制作程序,允许用户从文件夹中选择.bmp,然后根据它们与所选图像的相似程度显示文件夹中的其他图片。因此我创建了一个比较两个位图并返回分数

的函数
double compareImages(HBITMAP pic1,HBITMAP pic2);

分数越高,两张照片越相似。

我还创建了一个向量,用于保存文件夹中每张图片实例的句柄

std::vector<HBITMAP> pictures;

现在我想根据与所选图片进行比较时的分数对矢量中的手柄进行排序。应该先获得更高的分数。

std::sort(pictures.begin(),pictures.end(),[](const HBITMAP& pic1,const HBITMAP& pic2) -> bool 
{ 
double comp1 = compareImages(pic1,selectedPicture); //the score of pic1
double comp2 = compareImages(pic2,selectedPicture); //the score of pic2
return comp1>comp2;
}
);

收到错误:

||=== Build: Debug in imageComparator (compiler: GNU GCC Compiler) ===|

C:\Users\GS\Desktop\Programy\imageComparator\src\leftWindow.h||In function 'LRESULT WindowProcedureLeft(HWND, UINT, WPARAM, LPARAM)':|

C:\Users\GS\Desktop\Programy\imageComparator\src\rightWindow.h|133|warning: lambda expressions only available with -std=c++11 or -std=gnu++11|

C:\Users\GS\Desktop\Programy\imageComparator\src\rightWindow.h|134|error: no matching function for call to 'sort(std::vector<HBITMAP__*>::iterator, std::vector<HBITMAP__*>::iterator, WindowProcedureRight(HWND, UINT, WPARAM, LPARAM)::<lambda(HBITMAP__* const&, HBITMAP__* const&)>)'|

C:\Users\GS\Desktop\Programy\imageComparator\src\rightWindow.h|134|note: candidates are:|

C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\stl_algo.h|4676|note: template<class _RAIter> void std::sort(_RAIter, _RAIter)|

C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\stl_algo.h|4676|note:   template argument deduction/substitution failed:|

C:\Users\GS\Desktop\Programy\imageComparator\src\rightWindow.h|134|note:   candidate expects 2 arguments, 3 provided|

C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\stl_algo.h|4705|note: template<class _RAIter, class _Compare> void std::sort(_RAIter, _RAIter, _Compare)|

C:\Program Files (x86)\CodeBlocks\MinGW\lib\gcc\mingw32\4.9.2\include\c++\bits\stl_algo.h|4705|note:   template argument deduction/substitution failed:|

C:\Users\GS\Desktop\Programy\imageComparator\src\rightWindow.h|134|required from here|

C:\Users\GS\Desktop\Programy\imageComparator\src\rightWindow.h|134|error: template argument for 'template<class _RAIter, class _Compare> void std::sort(_RAIter, _RAIter, _Compare)' uses local type 'WindowProcedureRight(HWND, UINT, WPARAM, LPARAM)::<lambda(HBITMAP__* const&, HBITMAP__* const&)>'|

C:\Users\GS\Desktop\Programy\imageComparator\src\rightWindow.h|134|error:   trying to instantiate 'template<class _RAIter, class _Compare> void std::sort(_RAIter, _RAIter, _Compare)'|

重要的一点可能是:

C:\Users\GS\Desktop\Programy\imageComparator\src\rightWindow.h|134|error: template argument for 'template<class _RAIter, class _Compare> void std::sort(_RAIter, _RAIter, _Compare)' uses local type 'WindowProcedureRight(HWND, UINT, WPARAM, LPARAM)::<lambda(HBITMAP__* const&, HBITMAP__* const&)>'|

有什么不对,

是什么
local type 'WindowProcedureRight(HWND, UINT, WPARAM, LPARAM)::<lambda(HBITMAP__* const&, HBITMAP__* const&)>

实际上意味着什么?

1 个答案:

答案 0 :(得分:4)

重要的一点是

  

“C:\ Users \ GS \ Desktop \ Programy \ imageComparator \ src \ rightWindow.h | 133 |警告:lambda表达式仅适用于-std = c ++ 11或-std = gnu ++ 11 |”

您应该使用消息中提到的编译器开关打开C ++ 11功能。

另外,我想你正在做的比较可能会很慢。计算所有图像分数一次,然后使用缓存结果进行排序可能是明智的。

相关问题