1

Тема: bool operator == ()

Якщо я хочу використовувати функцію std::sort, то функція, якщо елементи рівні,

bool SomeClass::operator ==(const SomeClass &cl)

повинна повертати truе чи false?

Максимальний розмір підпису: 400 символів завдовжки та 4 рядків заввишки

2

Re: bool operator == ()

std::sort не використовує цей оператор.

3

Re: bool operator == ()

Kizyak, використай функтор(який задекларовано як статичний метод класу), це саме просте що може бути

#include <vector>
#include <iostream>
using namespace std;

class SomeClass{
     size_t value;
public:
      SomeClass(size_t value = 0){
         this->value = value;
      }
      static bool less(const SomeClass &left, const SomeClass &right){
         return left.value < right.value;
      }
      static bool more(const SomeClass &left, const SomeClass &right){
         return left.value > right.value;
      }
      size_t & data(){
          return value;
      }
}; 


int main(){
    size_t i, n;
    vector< SomeClass > arr;
    arr.push_back(SomeClass(3));
    arr.push_back(SomeClass(1));
    arr.push_back(SomeClass(2));
    std::sort(arr.begin(), arr.end(), SomeClass::less);
    for( i = 0, n = arr.size(); i < n; i++ )
       cout<<arr[i].data()<<endl;
    std::sort(arr.begin(), arr.end(), SomeClass::more);
    for( i = 0, n = arr.size(); i < n; i++ )
       cout<<arr[i].data()<<endl;
    return 0;
}

Перевірка http://codepad.org/QAUxches

1
2
3
3
2
1

Подякували: Kizyak1

4

Re: bool operator == ()

#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;
 
class SomeClass{
public:
    SomeClass(size_t value = 0) :  value(value)
    {
    }
    bool operator <(const SomeClass &right)const{
        return value < right.value;
    }
    size_t &data(){
         return value;
    }
    private:
        size_t value;
};
 
 
int main() {
    vector< SomeClass > arr = {3,1,2};
    std::sort( begin(arr), end(arr) );
    for(auto &elem: arr) {
        cout<<elem.data()<<" ";
    }
    cout<<endl;
    std::sort( begin(arr), end(arr), [](auto& left, auto& right){return !(left<right);} );
    for(auto &elem: arr) {
        cout<<elem.data()<<" ";
    }
    return 0;
}

http://ideone.com/3gftTL

Success    time: 0 memory: 3472 signal:0
1 2 3
2 3 1

Подякували: Kizyak, 0x9111A2

5

Re: bool operator == ()

Вже з самої назви sort видно, що нам потрібен оператор який би допомогав впорядкувати елементи. Перевірка на рівність, не допоможе нам вишикувати елементи від малого до великого за зростом, правда ж?

Де нам могла б знадобитись перевірка на рівність так це в х(г)еш-мапі. Як? Припустимо, що хеш-мапа використовує ланцюгування для розв'язання колізій, тоді всі елементи з однаковим хешем вишиковуються ланцюжком прив'язаним до певної комірки. Уявімо, що у вас два різних елементи мають той самий хеш, от вони й потрабляють в одну комірку, а я потім їх відрізнити? Ми просто проходимо відповідним ланцюжком і за допомогою == перевіряємо чи це той елемент, що нам потрібен.

А є контейнери, які й для перевірки на рівність використовують <. Які? Розгляньмо std::set, він зазвичай втілюється за допомогою червоно-чорного дерева (бо воно дерево і воно збалансоване:)). Щоб галузитись деревом, нам потрібне порівняння на менше ніж - <. А що якщо елемент А, який ми хочемо вставити вже є в дереві, наприклад у вузлі Б? Для коректної обробки цієї ситуації необхідно спочатку перевірити чи А < Б і чи А > Б. За результатом першої перевірки ми йдемо в один бік, другої в інший, інакше ми розуміємо, що це той самий елемент, тобто виконується ==. set і multiset по різному поводяться в цьому випадку.

ukrainian.stackexchange.com - це питання-відповіді з української мови
Подякували: Kizyak1

6

Re: bool operator == ()

Yola написав:

Вже з самої назви sort видно, що нам потрібен оператор який би допомогав впорядкувати елементи. Перевірка на рівність, не допоможе нам вишикувати елементи від малого до великого за зростом, правда ж?

Де нам могла б знадобитись перевірка на рівність так це в х(г)еш-мапі. Як? Припустимо, що хеш-мапа використовує ланцюгування для розв'язання колізій, тоді всі елементи з однаковим хешем вишиковуються ланцюжком прив'язаним до певної комірки. Уявімо, що у вас два різних елементи мають той самий хеш, от вони й потрабляють в одну комірку, а я потім їх відрізнити? Ми просто проходимо відповідним ланцюжком і за допомогою == перевіряємо чи це той елемент, що нам потрібен.

А є контейнери, які й для перевірки на рівність використовують <. Які? Розгляньмо std::set, він зазвичай втілюється за допомогою червоно-чорного дерева (бо воно дерево і воно збалансоване:)). Щоб галузитись деревом, нам потрібне порівняння на менше ніж - <. А що якщо елемент А, який ми хочемо вставити вже є в дереві, наприклад у вузлі Б? Для коректної обробки цієї ситуації необхідно спочатку перевірити чи А < Б і чи А > Б. За результатом першої перевірки ми йдемо в один бік, другої в інший, інакше ми розуміємо, що це той самий елемент, тобто виконується ==. set і multiset по різному поводяться в цьому випадку.

То що воно повинно повертати: дійсне чи протилежне значення?

Максимальний розмір підпису: 400 символів завдовжки та 4 рядків заввишки

7

Re: bool operator == ()

Kizyak написав:

То що воно повинно повертати: дійсне чи протилежне значення?

Не добрав, що ви маєте на увазі. Але точно сказу, що оператори повинні працювати правильно. Тобто якщо з точки зору вашої логіки А < Б, то й оператор < повинен повертати "істину", а оператори > і == повинні повертати "хибу".

ukrainian.stackexchange.com - це питання-відповіді з української мови
Подякували: Kizyak1