C++ 使用Lambda函数进行转换,而不是执行我希望的C++;

C++ 使用Lambda函数进行转换,而不是执行我希望的C++;,c++,lambda,stdmap,C++,Lambda,Stdmap,这个想法是让一个地图代表一个单词向量+它们在这个向量中出现的次数。请注意,我不允许使用任何循环或for_ 我认为编译器不喜欢lambda函数,我做错了什么 功能: map<string, int> CreateMap(vector<string> v) { sort(v.begin(), v.end()); auto last = unique(v.begin(), v.end()); map<string,int> m; transform(

这个想法是让一个地图代表一个单词向量+它们在这个向量中出现的次数。请注意,我不允许使用任何循环或for_

我认为编译器不喜欢lambda函数,我做错了什么

功能:

map<string, int> CreateMap(vector<string> v)
{
  sort(v.begin(), v.end());
  auto last = unique(v.begin(), v.end());
  map<string,int> m;
  transform(v.begin(), last, v.begin(), inserter(m, m.begin()),
            [&v](string const& x){return make_pair(x, count(v.begin(), v.end(), x));});
  return m;
}
In file included from /usr/include/c++/7/algorithm:62:0,
                 from Ordlista.cc:3:
/usr/include/c++/7/bits/stl_algo.h: In instantiation of ‘_OIter std::transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation) [with _IIter1 = __gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >; _IIter2 = __gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >; _OIter = std::insert_iterator<std::map<std::__cxx11::basic_string<char>, int> >; _BinaryOperation = CreateMap(std::vector<std::__cxx11::basic_string<char> >)::<lambda(const string&)>]’:
Ordlista.cc:102:86:   required from here
/usr/include/c++/7/bits/stl_algo.h:4345:25: error: no match for call to ‘(CreateMap(std::vector<std::__cxx11::basic_string<char> >)::<lambda(const string&)>) (std::__cxx11::basic_string<char>&, std::__cxx11::basic_string<char>&)’
  *__result = __binary_op(*__first1, *__first2);
              ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Ordlista.cc:102:33: note: candidate: CreateMap(std::vector<std::__cxx11::basic_string<char> >)::<lambda(const string&)>
             [&v](string const& x){return make_pair(x, count(v.begin(), v.end(), x));});
map-CreateMap(向量v)
{
排序(v.begin(),v.end());
自动结束=唯一(v.begin(),v.end());
地图m;
转换(v.begin(),last,v.begin(),插入器(m,m.begin()),
[&v](字符串常量&x){返回make_对(x,count(v.begin(),v.end(),x));};
返回m;
}
编译错误:

map<string, int> CreateMap(vector<string> v)
{
  sort(v.begin(), v.end());
  auto last = unique(v.begin(), v.end());
  map<string,int> m;
  transform(v.begin(), last, v.begin(), inserter(m, m.begin()),
            [&v](string const& x){return make_pair(x, count(v.begin(), v.end(), x));});
  return m;
}
In file included from /usr/include/c++/7/algorithm:62:0,
                 from Ordlista.cc:3:
/usr/include/c++/7/bits/stl_algo.h: In instantiation of ‘_OIter std::transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation) [with _IIter1 = __gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >; _IIter2 = __gnu_cxx::__normal_iterator<std::__cxx11::basic_string<char>*, std::vector<std::__cxx11::basic_string<char> > >; _OIter = std::insert_iterator<std::map<std::__cxx11::basic_string<char>, int> >; _BinaryOperation = CreateMap(std::vector<std::__cxx11::basic_string<char> >)::<lambda(const string&)>]’:
Ordlista.cc:102:86:   required from here
/usr/include/c++/7/bits/stl_algo.h:4345:25: error: no match for call to ‘(CreateMap(std::vector<std::__cxx11::basic_string<char> >)::<lambda(const string&)>) (std::__cxx11::basic_string<char>&, std::__cxx11::basic_string<char>&)’
  *__result = __binary_op(*__first1, *__first2);
              ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Ordlista.cc:102:33: note: candidate: CreateMap(std::vector<std::__cxx11::basic_string<char> >)::<lambda(const string&)>
             [&v](string const& x){return make_pair(x, count(v.begin(), v.end(), x));});
在/usr/include/c++/7/算法:62:0中包含的文件中,
摘自Ordlista.cc:3:
/usr/include/c++/7/bits/stl_algo.h:在“_iiterstd::transform”(_IIter1,_IIter1,_IIter2,_iiter,_iiter,_BinaryOperation)[带_IIter1=u gnu cxx:u normal\u iterator;_IIter2=u gnu cxx:::_normaluu-normal iter;_-OIter=std::insert;_-BinaryOperation=CreateMap(std::vector):]:
Ordlista.cc:102:86:此处为必填项
/usr/include/c++/7/bits/stl_-algo.h:4345:25:错误:调用“(CreateMap(std::vector)::)(std::uucx11::basic_string&,std:uuucx11::basic_string&)不匹配
*__结果=uuu二进制运算(*uuu first1,*uuu first2);
~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
Ordlista.cc:102:33:注:候选:CreateMap(std::vector)::
[&v](字符串常量&x){返回make_对(x,count(v.begin(),v.end(),x));};

您可以使用
累积
非常轻松地构建一个
映射
,如下所示:

std::map<std::string,int> CreateMap(std::vector<std::string> v)
{
  return std::accumulate(std::begin(v), std::end(v), 
                         std::map<std::string,int>{},
                         [](auto &m, auto &s) -> auto& { 
                           m[s]++; 
                           return m;
         });
}
std::map CreateMap(std::vector v)
{
返回标准::累计(标准::开始(v),标准::结束(v),
std::map{},
[](自动与维护、自动与维护)->自动与{
m[s]++;
返回m;
});
}

std::transform的第三个参数是什么意思?是否要将结果插入到向量中?此
count
调用将不起作用,因为范围
[last,v.end())
在调用
unique
后包含未指定的值。如果您有2个输入范围,则lambda需要2个参数。我不允许使用任何循环或每个循环,其想法是让一个映射表示一个词向量+它们在该向量中出现的次数。@JoelBäckström请将该要求添加到问题中,and不作为评论。