C++ 使用Lambda函数进行转换,而不是执行我希望的C++;
这个想法是让一个地图代表一个单词向量+它们在这个向量中出现的次数。请注意,我不允许使用任何循环或for_ 我认为编译器不喜欢lambda函数,我做错了什么 功能: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(
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不作为评论。