c++ - 如何按一种度量对元素进行排序

标签 c++ visual-studio-2010 function sorting iterator

在 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/

相关文章:

c++ - 为什么需要等效条件?

c++ - 如何获得两个 std::map 的公共(public)键?

c++ - 使用内存映射文件进行序列化

visual-studio - 是否有 Visual Studio 工具来显示程序集的对象模型?

Javascript:根据单击的按钮运行脚本

c++ - 函数指针类型定义错误

c++ - 生产者/消费者实现——需要反馈

c# - 搜索功能无法正常使用

c++ - C++ : . NET Framework 警告的 Visual Studio 设置

C++错误: multiple definition of a member function specialized in template class,但我真的只定义了一次