正如你所说,绑定和lambda不完全针对相同的目标。例如,对于使用和组合STL算法,lambda是清晰的赢家,恕我直言。为了说明这一点,我记得有一个非常有趣的答案,在堆栈溢出问题上,有人提出了十六进制幻数的想法(如0xDEADBEEF,0xCAFEBABE,0xDEADDEAD等),并被告知如果他是一个真正的C++程序员他也只会下载的英语单词列表,并使用C++一个简单的一行:)
#include <iterator>
#include <string>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
int main()
{
using namespace boost::lambda;
std::ifstream ifs("wordsEn.txt");
std::remove_copy_if(
std::istream_iterator<std::string>(ifs),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, "\n"),
bind(&std::string::size, _1) != 8u
||
bind(
static_cast<std::string::size_type (std::string::*)(const char*, std::string::size_type) const>(
&std::string::find_first_not_of
),
_1,
"abcdef",
0u
) != std::string::npos
);
}
这个片段中,在纯C++ 98,打开英语单词文件,扫描每个字并打印'a','b','c','d','e'或'f'字母的长度为8的字母。
现在,打开的C++ 0x和lambda:
#include <iterator>
#include <string>
#include <algorithm>
#include <iostream>
#include <fstream>
int main()
{
std::ifstream ifs("wordsEn.txt");
std::copy_if(
std::istream_iterator<std::string>(ifs),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>(std::cout, "\n"),
[](const std::string& s)
{
return (s.size() == 8 &&
s.find_first_not_of("abcdef") == std::string::npos);
}
);
}
这仍然是一个有点重(这主要是因为istream_iterator业务)来读取,但比绑定版本简单得多:)
是否有任何性能差异?速度,内存消耗,堆使用率? – 2009-12-19 03:33:44
@Caspin我不知道这两个工具之间的性能/内存消耗是否有差异:) – AraK 2009-12-19 04:54:38
btw:这两个版本并不相同,因为绑定复制参数。替代方法:bind(ref(distribution),ref(engine)) – sellibitze 2009-12-19 10:32:08