使用Lambda函数进行的转换未完成我想要的C ++

问题描述 投票:0回答:1

想法是让地图代表单词的矢量+在该矢量中出现的次数。请注意,我不允许使用任何循环或for_each。

我认为编译器不喜欢该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;
}

COMPILE ERROR:

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));});
c++ lambda stdmap
1个回答
1
投票

您可以使用map轻松构建accumulate,如下所示:

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;
         });
}
© www.soinside.com 2019 - 2024. All rights reserved.