假设我有以下容器:
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)));
但是这会产生编译错误,类似于在类boost :: assign_detail :: generic_list,int&gt;类中没有名为'result_type'的类型。 &GT;”
for 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&gt;&amp;),std :: vector,int&gt;不匹配&GT; &gt;)(std :: vector,int&gt;&gt; *&amp;,boost :: assign_detail :: generic_list,int&gt;&gt;&amp;)'
这样做的正确方法是什么?请注意,我不能使用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));
产生编译错误:无法转换'&amp; boost :: assign :: map_list_of'(type'')输入'std :: map,int&gt; (*)(const std :: basic_string&amp;,int)'
答案 0 :(得分:1)
试试这个:
#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 :(得分:0)
BOOST_FOREACH(const std::string& str, input)
result[str] = 1;
我意识到这并没有使用STL算法和Boost.Bind,但它简洁直观。