Как вы сказали, bind и лямбды не совсем точно нацелены на одну и ту же цель.
Например, для использования и составления алгоритмов STL лямбды являются явными победителями, ИМХО.
Чтобы проиллюстрировать, я помню действительно смешной ответ здесь, когда переполнение стека, где кто-то просил идеи шестизначных магических чисел (например, 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, открыть файл английских слов, сканировать каждое слово и печать только те длиной 8 с буквами 'a', 'b', 'c', 'd', 'e' или 'f'.
Теперь включите C++ 0x и лямбда:
#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 бизнеса), но намного проще, чем версия привязки :)
Есть ли отличия в производительности? скорость, потребление памяти, использование кучи? –
@Caspin Я не знаю, есть ли разница в производительности/потреблении памяти между этими двумя инструментами :) – AraK
Кстати: две версии не эквивалентны, потому что привязывают копии аргументов. Альтернатива: bind (ref (распространение), ref (двигатель)) – sellibitze