Повысить привязку и назначить для преобразования вектора в строку

Предположим, у меня есть следующие контейнеры:

vector<string> input = assign::list_of("one")("two")("three")("four");
vector<map<string, int> > result;

И сказать, что я хочу, чтобы результат выглядел примерно так:

{{"one", 1}, {"two", 1}, {"three", 1}, {"four", 1}}

Я хотел бы использовать алгоритм STL, я думаю, что либо transform, либо for_each должны быть в порядке.
Для преобразования у меня есть код:

transform(input.begin(), input.end(), back_inserter(result), boost::bind(assign::map_list_of(_1, 1)));

Но это приводит к ошибке компиляции в соответствии с нет типа с именем «result_type» в классе boost :: assign_detail :: generic_list, int>> ’

Для for_each у меня есть код:

    for_each(input.begin(), input.end(),
boost::bind<void, void(std::vector<std::map<std::string, int> >::*)(const map<string, int>&)>(
&std::vector<std::map<std::string, int> >::push_back,
&result,
assign::map_list_of(_1, 1)));

Но это приводит к ошибке компиляции, которая в итоге: нет соответствия для вызова ‘(boost :: _ mfi :: dm, int>&), std :: vector, int>>>) (std :: vector, int>> *&, boost :: assign_detail :: generic_list, int>>&)»

Как правильно это сделать? Обратите внимание, что я не могу использовать C ++ 11, и я хотел бы использовать boost_bind в сочетании с алгоритмом STL просто для того, чтобы узнать больше о boost :: bind.


Комментарий WRT @ Joachim о вызове map_list_of, я сделал следующую модификацию:

for_each(input.begin(), input.end(),
boost::bind<void, void(std::vector<std::map<std::string, int> >::*)(const map<string, int>&)>(
&std::vector<std::map<std::string, int> >::push_back,
&result,
boost::bind<void, map<string, int>(const string&, int)>(&assign::map_list_of, _1, 1));

Что приводит к ошибке компиляции: не может конвертировать ‘& boost :: assign :: map_list_of ’(типа‘ ’) для ввода‘ std :: map, int> (*) (const std :: basic_string&, int) ’

0

Решение

Попробуй это:

#include <boost/assign.hpp>
#include <boost/bind.hpp>
#include <vector>
#include <map>
#include <string>

int main()
{
std::vector<std::string> input = boost::assign::list_of("one")("two")("three")("four");
std::vector<std::map<std::string, int> > result;

for_each
(
input.begin()
, input.end()
, boost::bind
(
static_cast<void(std::vector<std::map<std::string, int> >::*)(const std::map<std::string, int>&)>(&std::vector< std::map<std::string, int> >::push_back)
, &result
, boost::bind(&boost::assign::map_list_of<std::string, int>, _1, 1)
)
);

return 0;
}
1

Другие решения

BOOST_FOREACH(const std::string& str, input)
result[str] = 1;

Я понимаю, что это не использует алгоритмы STL и Boost.Bind, но это сжато и интуитивно понятно.

0

По вопросам рекламы [email protected]