Каково поведение функции сортировки cpp, используя перегруженную по умолчанию большую функцию для вектора - PullRequest
0 голосов
/ 26 марта 2020

Разница между sort(begin(ans), end(ans)) против sort(begin(ans), end(ans), std::greater<std::vector<std::vector<int> > >())

при sort(begin(ans), end(ans)) работает отлично, как и ожидалось, где при задании большего не работает.

  vector<int> S = {12,13, 34, 9,10};
  vector<vector<int> >ans;
  vector<int> currSet;
  subset(0, S, currSet, ans);
  sort(begin(ans), end(ans), std::greater<std::vector<std::vector<int> > >());
  cout << ans.size();
}

дает ошибку

In file included from subset.cpp:1:
In file included from /usr/local/include/bits/stdc++.h:52:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/ccomplex:21:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/complex:247:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/sstream:174:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/ostream:138:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/ios:216:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__locale:15:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/string:505:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/string_view:176:
In file included from /Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/__string:57:
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/algorithm:3832:17: error: no
      matching function for call to object of type
      'std::__1::greater<std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >,
      std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > > >'
            if (__comp(*--__last, *__first))
                ^~~~~~
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/algorithm:4018:5: note: in
      instantiation of function template specialization
      'std::__1::__sort<std::__1::greater<std::__1::vector<std::__1::vector<int,
      std::__1::allocator<int> >, std::__1::allocator<std::__1::vector<int,
      std::__1::allocator<int> > > > > &, std::__1::vector<int, std::__1::allocator<int> >
      *>' requested here
    __sort<_Comp_ref>(__first, __last, __comp);
    ^
/Library/Developer/CommandLineTools/usr/bin/../include/c++/v1/algorithm:4052:12: note: in
      instantiation of function template specialization
      'std::__1::sort<std::__1::vector<int, std::__1::allocator<int> > *,
      std::__1::greater<std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >,
      std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > > > &>'
      requested here
    _VSTD::sort<_Tp*, _Comp_ref>(__first.base(), __last.base(), __comp);
           ^
subset.cpp:33:3: note: in instantiation of function template specialization
      'std::__1::sort<std::__1::vector<int, std::__1::allocator<int> >,
      std::__1::greater<std::__1::vector<std::__1::vector<int, std::__1::allocator<int> >,
      std::__1::allocator<std::__1::vector<int, std::__1::allocator<int> > > > > >'
      requested here
  sort(all(ans), greater<vector<vector<int> > >());
  ^


Ответы [ 2 ]

3 голосов
/ 26 марта 2020

std::greater<std::vector<std::vector<int> > > для сравнения объектов типа std::vector<std::vector<int> >. Но вектор ans не содержит объектов этого типа. Содержит объекты типа std::vector<int>. Таким образом, вам нужен компаратор std::greater<std::vector<int>>. Или вы можете просто использовать std::greater<>, что проще для чтения, записи и с меньшей вероятностью приведет к ошибке.

1 голос
/ 26 марта 2020

Параметр шаблона для std::greater должен быть типом элемента, на который указывают итераторы. Поскольку итератор для std::vector<std::vector<int>> имеет value_type std::vector<int> (это тип элементов в ans), это то, что вам нужно. Это дает вам

sort(begin(ans), end(ans), std::greater<std::vector<int> >());

как то, что вам нужно.


Также обратите внимание, что для закрытия > в списке параметров шаблона больше не требуется пробел. Вы можете использовать

sort(begin(ans), end(ans), std::greater<std::vector<int>>());

, и это скомпилируется в компилятор, совместимый с C ++ 11 +.

...