如何使用Boost(Lambda?)使std::sort()更容易
How to use Boost (Lambda?) to make std::sort() easier?
假设我有
struct Value { int foo(); };
size_t *begin = ...,
*end = ...;
如果我想在C++03中对一堆Value
索引进行排序,我必须写一些乏味的东西:
struct Comparator
{
Value *data;
Comparator(Value *data) : data(data) { }
bool operator()(size_t a, size_t b)
{ return data[a].foo() < data[b].foo(); }
};
sort(begin, end, Comparator(data));
有没有办法用Boost(也许用Boost.Lambda)更巧妙地写这篇文章,最好是一行?
否。
Boost.Lambda在处理过载操作员时效果最好。一旦你将命名函数调用引入到事物中,Boost.Lambda在使代码更加简洁易读方面就变得不那么有用了。你必须开始使用函数绑定器和其他类似的东西。
事实上,您使用lambda参数作为索引(而不是正在索引的值)可能会把事情搞砸,甚至在BoostLambda库中也使用了运算符[]。
你可以做出类似的Boost.Lambda。但它不会是我称之为"整洁"的东西,"1行"会非常长。
C++11在语言中引入Lambda,而不是仅仅将Boost.Lambda合并到标准库中,这是有原因的。
哦,别忘了:Boost。Lambda通常被认为是过时的。使用Boost.Phoenix。当然,它不会像Lambda那样对你有任何帮助。
使用Boost.Fenix(Boost的首选lambda库):
#include <boost/phoenix/phoenix.hpp>
{
// for bind and ref
using namespace boost::phoenix;
using namespace boost::phoenix::placeholders;
std::sort(begin, end
, bind(&Value::foo, ref(data)[arg1]) < bind(&Value::foo, ref(data)[arg2]) );
}
另一种选择是使用LocalFunction,它本质上允许您以可移植的方式执行正在执行的操作(将本地类型传递给std::sort
,这对于C++03是不允许的)。用法应该是(代码未经测试):
#include <boost/local_function.hpp>
{
int BOOST_LOCAL_FUNCTION(const bind& data, std::size_t lhs, std::size_t rhs)
{
return data[lhs].foo() < data[rhs].foo();
} BOOST_LOCAL_FUNCTION_NAME(comparator)
std::sort(begin, end, comparator);
}
相关文章:
- 使用额外的变量使计算更容易理解 - (多少)我减慢了代码的速度?
- 哪个更好 std::p rev(itr) 或 --itr.
- 为什么传递值参数经常使编译器更容易进行代码优化
- 让使用函数指针作为模板参数的任何方法更容易
- 我应该更喜欢std::thread还是Boost线程
- 如何使用Boost(Lambda?)使std::sort()更容易
- 碰撞检测和时间复杂性:如何使检查碰撞更容易
- 为什么更喜欢std::vector而不是std::d eque
- 一个更容易的拷贝分配操作符实现
- 如何创建一个线性搜索算法比我的教科书提供的更容易
- 在窗口循环中,在窗口控件上获取鼠标移动比子类化更容易
- 什么类型的设计模式使事件更容易
- 更容易在QTreeView中找到QModelIndex的可见行
- 加载屏幕更容易的方法?c++
- 宏使属性更容易
- 函子——它们是用来使操作符重载更容易吗?
- 按照每个通用寄存器的用途对 x86 程序集进行编码是必要还是更容易
- std::vector比std::list (STL容器)更容易失败
- c++ ||添加两个矩阵的方式更容易输出
- 哪种技术更容易被编译器分析?