C ++ <algorithm>sort () с использованием объекта в качестве определения сравнения - PullRequest
0 голосов
/ 12 января 2020

http://www.cplusplus.com/reference/algorithm/sort/

Я читаю эту ссылку здесь, и это меня смутило. Как работает сортировка с использованием myobject в строке std::sort (myvector.begin(), myvector.end(), myobject)? И как перегружается bool operator() (int i,int j) { return (i<j)? Я не понимаю, как () перегружен, но я могу видеть, что это связано с тем, как myobject используется.

    // sort algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

struct myclass {
  bool operator() (int i,int j) { return (i<j);}
} myobject;

int main () {
  int myints[] = {32,71,12,45,26,80,53,33};
  std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33

  // using object as comp
  std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

1 Ответ

0 голосов
/ 12 января 2020

Я не понимаю, как () перегружен

Полагаю, что здесь нечего понимать. Это просто метод-член с довольно странным именем (operator() в объявлении / определении) и вызываемый странным образом (object() вместо object.ordinary_method()). Это просто syntacti c сахар, никаких черных магов c.

Объект служит своего рода прокси для передачи функции. До того, как лямбды стали частью языка, передача функций напрямую была довольно громоздкой. Проходить struct или class было намного проще. И структура с operator() может использоваться как функция. Кроме того, объект может хранить некоторые данные, что иногда удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...