Чтобы просто скопировать вектор в набор, вы можете использовать зЬй :: копию и вставки итератор. Что-то вроде:
std::copy(s_vector.begin(), s_vector.end(), std::inserter(s_set, s_set.end()));
Конечно это не использовать повышение :: лямбда вообще, так что это, вероятно, не поможет вам обобщить это делать то, что вы хотите. Было бы лучше узнать больше о том, что вы пытаетесь сделать здесь. Я собираюсь предположить, основываясь на вашем упоминании лямбда :: _, если ваша лямбда собирается сделать какую-то фильтрацию входного вектора перед вставкой в набор.
Следующий (полный, испытано) пример показывает, как скопировать только строки, которые < = 4 символов из вектора в комплект:
#include <boost/assign/list_of.hpp>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <boost/test/minimal.hpp>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
using namespace boost::lambda;
using namespace boost::assign;
int test_main(int argc, char* argv[])
{
vector<string> s_vector = list_of("red")("orange")("yellow")("blue")("indigo")("violet");
set<string> s_set;
// Copy only strings length<=4 into set:
std::remove_copy_if(s_vector.begin(), s_vector.end(), std::inserter(s_set, s_set.end()),
bind(&string::length, _1) > 4u);
BOOST_CHECK(s_set.size() == 2);
BOOST_CHECK(s_set.count("red"));
BOOST_CHECK(s_set.count("blue"));
return 0;
}
Надеется, что это дает вам то, чтобы идти дальше?
Также позвольте мне повторить вышеописанную точку: boost :: bind and boost :: lambda :: bind - это два разных зверя. Концептуально они похожи, но они производят результаты разных типов. Только последние могут быть объединены с другими лямбдами.
Я пытался это сделать, но не нашел правильную комбинацию typedefs и статических применений. Похоже, что это будет делать именно то, что я хочу, хотя я, вероятно, воспользуюсь немного более простым решением, аналогичным тому, что было предложено Alastair выше. Это одна из подстилок boost :: lambda. :( – 2008-11-11 06:43:03