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

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

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’ в ‘class 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' (type '') в тип 'std :: map, int> (*) (const std :: basic_string &, int)' < / сильный>


person Tom    schedule 11.08.2014    source источник
comment
Между прочим, ваше использование boost::assign::map_list_of в вашем boost::bind вызове неправильно, поскольку вы на самом деле вызываете функцию map_list_of, передавая ее результат в качестве функции для вызова (что, конечно, приведет к ошибкам).   -  person Some programmer dude    schedule 11.08.2014


Ответы (2)


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

#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;    
}
person Brandon Kohn    schedule 11.08.2014
comment
Вероятно, вам следует использовать косые черты в ваших #includes. - person John Zwinck; 12.08.2014

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

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

person John Zwinck    schedule 11.08.2014
comment
Но result - это не карта, это вектор. - person Some programmer dude; 11.08.2014
comment
Это не отвечает на вопрос, поскольку я специально сказал, что хочу использовать алгоритмы STL и привязку. - person Tom; 11.08.2014
comment
@Tom: ну, возможно, если ты расскажешь нам немного больше о том, почему у тебя такое желание, мы сможем тебе больше помочь. В противном случае сложно получить мотивацию испортить идеально подходящий цикл for. - person John Zwinck; 11.08.2014
comment
@JoachimPileborg: Вы правы, но пример OP тоже не показывает вектор карт, так что .... Я полагаю, мы можем построить результат с 1, а затем выполнить result.front()[str] = 1. Не совсем понятно из вопроса. - person John Zwinck; 11.08.2014
comment
@JohnZwinck Вопрос совершенно ясен относительно того, чего я хочу достичь, я думаю, что моя мотивация не имеет значения. - person Tom; 11.08.2014
comment
@Tom Может помочь, если вы расскажете нам о проблеме, которую пытаетесь решить с помощью своего решения. Могут быть другие, может быть, даже лучшие решения. Если это просто для развлечения и обучения, это тоже нормально, но тогда вы должны хотя бы упомянуть об этом в вопросе. Просто сказать, что у меня есть это решение, пожалуйста, помогите мне заставить его работать, без описания проблемы не очень полезно для нас, которые пытаются вам помочь. Вы должны помочь нам помочь вам. :) Также прочтите о проблеме XY, если вы этого еще не сделали. пока что. - person Some programmer dude; 11.08.2014
comment
@Tom И, как я уже сказал, это тоже нормально. Просто помните, что даже если кто-то потерпит неудачу, он все равно чему-то научился. ;) - person Some programmer dude; 11.08.2014