在 C++ 中,我不太了解如何通过定义自定义函数对元素进行排序。
Cppreference.com 说对于比较函数:
comp - comparison function which returns true if the first argument is less than the second.
bool cmp(const Type1 &a, const Type2 &b);
自然而然地,我会认为为了对元素进行排序,我需要定义一个度量,并且排序函数会根据度量对它们进行排序。
在我的实际示例中,我想根据图像文件与相机的距离对它们进行排序。我有一个链接到图像序列目录的 boost::filesystem::path vector
vector<boost::filesystem::path> path_vec
我自然而然地认为我需要编写这样的函数
double z_distance( boost::filesystem::path filename, integer time )
什么会为所有元素返回一个 double 值,并为每一帧按升序或降序对它们进行排序(因此参数中的变化时间)。
你能告诉我如何将这个返回单个值的函数转换为排序函数所需的 bool 函数吗?
如果我只能传递函数名称,而不是对函数的完整调用,我该如何传递参数?
最佳答案
当你定义
bool nearer(const boost::filesystem::path& a, const boost::filesystem::path& b)
{
int somevalue = 0;
return z_distance(a, somevalue) < z_distance(b, somevalue);
}
你可以做到
std::sort(path_vec.begin(), path_vec.end(), nearer);
但是,我不知道如何处理函数 z_distance()
的第二个参数。也许你可以从你的文件中获取它,或者你必须使用仿函数而不是函数来比较。对于仿函数,请参阅@templatetypedef 给出的答案。
由于您标记了 VC++10,您还可以使用 C++0x 功能:编写一个 lambda 表达式(一个临时函数)来传递参数:
int somevalue = 0;
std::sort(path_vec.begin(), path_vec.end(),
[=](const boost::filesystem::path& a, const boost::filesystem::path& b) -> bool
{
return z_distance(a, somevalue) < z_distance(b, somevalue);
}
);
关于c++ - 如何按一种度量对元素进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6793863/