正如你所說,綁定和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