Тема: bool operator == ()
Якщо я хочу використовувати функцію std::sort, то функція, якщо елементи рівні,
bool SomeClass::operator ==(const SomeClass &cl)
повинна повертати truе чи false?
Ви не увійшли. Будь ласка, увійдіть або зареєструйтесь.
Ласкаво просимо вас на україномовний форум з програмування, веб-дизайну, SEO та всього пов'язаного з інтернетом та комп'ютерами.
Будемо вдячні, якщо ви поділитись посиланням на Replace.org.ua на інших ресурсах.
Для того щоб створювати теми та надсилати повідомлення вам потрібно Зареєструватись.
Український форум програмістів → C++ → bool operator == ()
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися
Якщо я хочу використовувати функцію std::sort, то функція, якщо елементи рівні,
bool SomeClass::operator ==(const SomeClass &cl)
повинна повертати truе чи false?
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
#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;
}
Success time: 0 memory: 3472 signal:0
1 2 3
2 3 1
Вже з самої назви sort видно, що нам потрібен оператор який би допомогав впорядкувати елементи. Перевірка на рівність, не допоможе нам вишикувати елементи від малого до великого за зростом, правда ж?
Де нам могла б знадобитись перевірка на рівність так це в х(г)еш-мапі. Як? Припустимо, що хеш-мапа використовує ланцюгування для розв'язання колізій, тоді всі елементи з однаковим хешем вишиковуються ланцюжком прив'язаним до певної комірки. Уявімо, що у вас два різних елементи мають той самий хеш, от вони й потрабляють в одну комірку, а я потім їх відрізнити? Ми просто проходимо відповідним ланцюжком і за допомогою == перевіряємо чи це той елемент, що нам потрібен.
А є контейнери, які й для перевірки на рівність використовують <. Які? Розгляньмо std::set, він зазвичай втілюється за допомогою червоно-чорного дерева (бо воно дерево і воно збалансоване:)). Щоб галузитись деревом, нам потрібне порівняння на менше ніж - <. А що якщо елемент А, який ми хочемо вставити вже є в дереві, наприклад у вузлі Б? Для коректної обробки цієї ситуації необхідно спочатку перевірити чи А < Б і чи А > Б. За результатом першої перевірки ми йдемо в один бік, другої в інший, інакше ми розуміємо, що це той самий елемент, тобто виконується ==. set і multiset по різному поводяться в цьому випадку.
Вже з самої назви sort видно, що нам потрібен оператор який би допомогав впорядкувати елементи. Перевірка на рівність, не допоможе нам вишикувати елементи від малого до великого за зростом, правда ж?
Де нам могла б знадобитись перевірка на рівність так це в х(г)еш-мапі. Як? Припустимо, що хеш-мапа використовує ланцюгування для розв'язання колізій, тоді всі елементи з однаковим хешем вишиковуються ланцюжком прив'язаним до певної комірки. Уявімо, що у вас два різних елементи мають той самий хеш, от вони й потрабляють в одну комірку, а я потім їх відрізнити? Ми просто проходимо відповідним ланцюжком і за допомогою == перевіряємо чи це той елемент, що нам потрібен.
А є контейнери, які й для перевірки на рівність використовують <. Які? Розгляньмо std::set, він зазвичай втілюється за допомогою червоно-чорного дерева (бо воно дерево і воно збалансоване:)). Щоб галузитись деревом, нам потрібне порівняння на менше ніж - <. А що якщо елемент А, який ми хочемо вставити вже є в дереві, наприклад у вузлі Б? Для коректної обробки цієї ситуації необхідно спочатку перевірити чи А < Б і чи А > Б. За результатом першої перевірки ми йдемо в один бік, другої в інший, інакше ми розуміємо, що це той самий елемент, тобто виконується ==. set і multiset по різному поводяться в цьому випадку.
То що воно повинно повертати: дійсне чи протилежне значення?
То що воно повинно повертати: дійсне чи протилежне значення?
Не добрав, що ви маєте на увазі. Але точно сказу, що оператори повинні працювати правильно. Тобто якщо з точки зору вашої логіки А < Б, то й оператор < повинен повертати "істину", а оператори > і == повинні повертати "хибу".
Сторінки 1
Для відправлення відповіді ви повинні увійти або зареєструватися