2013-07-27 4 views
0

В некоторых std библиотека template «s параметра, которого необходимо определить его/ее собственную функцию компаратора less(a, b), more(a, b) затем std::some_template<T, *, myComparator()>, но почему?Почему бы нам еще нужно определить свою собственную функцию компаратора

+1

что же делать "СТЛ"? –

+0

Все они имеют свой компаратор по умолчанию. Его все на намерении программиста – P0W

+0

@ H2CO3 Я не знаю, что назвать этому термину, поэтому я просто называю это stl, извините – mr5

ответ

5

Целью компаратора является сортировка объектов в сортированных контейнерах stl. Вам нужно только предоставить свой собственный компаратор, если по умолчанию он не подходит для типа объекта, который будет храниться в контейнере.

Например, если вы должны были сделать std :: set из следующих struct, тогда вам нужно будет написать собственный компаратор.

struct Person 
{ 
    std::string first_name, last_name, phone_number; 
} 

Компаратор по умолчанию знает, как сравнивать числа и строки, но он не знает, как сравнивать объекты Person. Вот как можно было написать пользовательский компаратор для сортировки объектов Person по имени last_name.

struct Person_Comparator 
{ 
    bool operator()(const Person &a, const Person &b) const { 
     return a.last_name < b.last_name; 
    } 
}; 
1

Другой пример позволяет сделать ряд с некоторой иной критерий

int main() 
{ 
    //By default set will use std::less<int>() 
    //Lets make a set based on no. of 1's in binary representation of elements 

    set<int,mycomp> s; 
    for(auto i=1;i<20;i++) //Note :Duplicates 1's representation will be discarded 
     s.insert(i); 

    for(auto i:s) 
     cout<<i<< " "; //19 15 8 7 3 1 
    return 0; 
} 

И соответствующего компаратора будет что-то вроде следующего:

struct mycomp 
{ 
    bool operator()(const int& a, const int& b) const { 
     auto count_bits = [](long n){ 
      unsigned int c; 
      for (c = 0; n; c++) 
      n &= n - 1; 
      return c; 
     }; 
      return count_bits(a) != count_bits(b); 
     } 
}; 
0

Мы все еще иногда нужно определить свою собственную функцию компараторы в общем программировании, но нам не всегда нужно писать сами). Вы можете просто использовать этот онлайн-мастер [http://www.xochellis.org/genericdataordering/wizard .php], чтобы создать строго-слабоупорядочивающие функторы или лямбды, которые вам нужны.

Например, в примере примера Person_Comparator вы должны просто заполнить три поля в форме мастера, например, this picture.

Для получения более подробной информации вы можете обратиться here, а также:

С наилучшими пожеланиями, Джим Xochellis

Смежные вопросы