Форум программистов, компьютерный форум CyberForum.ru

не могу понять почему не работает std::sort() - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
31.03.2011, 17:34     не могу понять почему не работает std::sort() #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <vector>
#include <algorithm>
 
using namespace std;
 
class T{
    public:
        T(int a_, int b_) : a(a_), b(b_){}
 
        bool operator < (T other){
            return Mid() < other.Mid();
        }
 
        int Mid(){
            return (a+b)/2;
        }
    private:
        int a,b;
};
 
 
 
int main()
{
    T t1(10, 20), t2(0, 50), t3(100, 200), t4(60, 100);
    vector<T> in;
 
    in.push_back(t1);
    in.push_back(t2);
    in.push_back(t3);
    in.push_back(t4);
 
    sort(in.begin(), in.end()); // вылетает с непонятной ошибкой 
    // stl_algo.h|89|error: passing 'const T' as 'this' argument of 'bool T::operator<(T)' discards qualifiers|
 
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
bambino
 Аватар для bambino
193 / 19 / 4
Регистрация: 05.08.2010
Сообщений: 229
31.03.2011, 17:54     не могу понять почему не работает std::sort() #2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <vector>
#include <algorithm>
 
using namespace std;
 
class T{
    public:
        T(){}
        T(int a_, int b_) : a(a_), b(b_){}
 
        friend bool operator < (T, T);
 
        int Mid(){
            return (a+b)/2;
        }
    private:
        int a,b;
};
 
bool operator < (T other, T _other){
  return _other.Mid() < other.Mid();
}
 
int main()
{
    T t1(10, 20), t2(0, 50), t3(100, 200), t4(60, 100);
    vector<T> in;
 
    in.push_back(t1);
    in.push_back(t2);
    in.push_back(t3);
    in.push_back(t4);
 
    sort(in.begin(), in.end()); // вылетает с непонятной ошибкой
    // stl_algo.h|89|error: passing 'const T' as 'this' argument of 'bool T::operator<(T)' discards qualifiers|
 
    return 0;
}
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.03.2011, 17:59     не могу понять почему не работает std::sort() #3
C++
1
bool operator < (const T & other)
Добавлено через 1 минуту
Цитата Сообщение от no0ker Посмотреть сообщение
passing 'const T' as 'this' argument of 'bool T::operator<(T)' discards qualifiers
Собственно, передаётся константный объект (по значению) и не может избавиться от квалификатора const, что есть хорошо. Неизменяемые объекты должны передаваться по константной ссылке.

Добавлено через 22 секунды
Даже так:
C++
1
bool operator < (const T & other) const
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
31.03.2011, 18:08  [ТС]     не могу понять почему не работает std::sort() #4
rik_nel, можно ли обойтись без
C++
1
friend
?

Deviaphan, три раза прочитал. ничего не понял. =(

C++
1
2
3
        bool operator < (const T &a) const{
            return Mid() < a.Mid();
        }
вылетает с той же ошибкой
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
31.03.2011, 18:12     не могу понять почему не работает std::sort() #5
Цитата Сообщение от no0ker Посмотреть сообщение
вылетает с той же ошибкой
Mid тоже должна быть константным методом.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
31.03.2011, 22:59     не могу понять почему не работает std::sort() #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <vector>
#include <algorithm>
 
using namespace std;
 
class T{
    public:
        T(){}
        T(int a_, int b_) : a(a_), b(b_){}
 
        int Mid() const{
            return (a+b)/2;
        }
    private:
        int a,b;
};
 
bool operator < (const T& other, const T& _other){
  return _other.Mid() < other.Mid();
}
 
int main()
{
    T t1(10, 20), t2(0, 50), t3(100, 200), t4(60, 100);
    vector<T> in;
 
    in.push_back(t1);
    in.push_back(t2);
    in.push_back(t3);
    in.push_back(t4);
 
    sort(in.begin(), in.end()); // вылетает с непонятной ошибкой
    // stl_algo.h|89|error: passing 'const T' as 'this' argument of 'bool T::operator<(T)' discards qualifiers|
 
    return 0;
}
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
01.04.2011, 04:51  [ТС]     не могу понять почему не работает std::sort() #7
ForEveR, немного не то, как хотелось бы. желательно, что бы оператор "меньше" был переопределен как функция класса. Буду использовать вариант от Deviaphan.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.04.2011, 09:14     не могу понять почему не работает std::sort() #8
no0ker, По идее это нежелательно, т.к. это неверно концептуально. Операторы сравнения делаются в основном вспомогательными функциями.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.04.2011, 09:19     не могу понять почему не работает std::sort() #9
Цитата Сообщение от ForEveR Посмотреть сообщение
По идее это нежелательно, т.к. это неверно концептуально
"Концептуальный" смысл в другом. Когда оператор определён как дружественная функция и у класса есть преобразующий конструктор, то можно сравнивать объект данного типа, с объектами совместимого типа. Причём объект может быть как слева, так и справа. Когда оператор определён как метод, то совместимый тип может быть только справа. Т.е. определение его как дружественной функции улучшает функциональность.
Больше никакой разницы нет, только холивар.
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
01.04.2011, 11:30  [ТС]     не могу понять почему не работает std::sort() #10
ForEveR, не могли бы вы пояснить.
я собираюсь сравнивать объекты одного класса. мне кажется логичным переопределить операторы (для работы с данным классом) в одном месте с самим описанием класса. и ума не приложу, зачем может понадобиться сравнивать объекты разных классов.

Добавлено через 2 минуты

Не по теме:

Deviaphan, вы в своем духе. вроде и слова русские. а вот мысль понять не могу... сложновато что-то.

Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.04.2011, 11:44     не могу понять почему не работает std::sort() #11
Немного оффтоп, но я попробую пояснить:
C++
1
2
3
4
5
6
7
8
9
10
11
class A
{
public:
    A( int a );
};
 
bool operator < (const A& L, const A& R );
 
A a;
if( A < 3 ) ...
if( 3 < A ) ...
Т.к. конструктор не explicit, то происходит неявное приведение int(3) к классу A и объект класса А можно сравнить с int. При определении оператора сравнения, как метода класса будет доступен только первый вариант сравнения, в случае функции оба варианта.
Как-то так вот.

Добавлено через 1 минуту
Цитата Сообщение от no0ker Посмотреть сообщение
в одном месте с самим описанием класса
Важно лишь то, чтобы они были в одной области видимости. Всё.

Не по теме:

ОМГ! У меня есть свой, неповторимый, невнятный стить! Я рад.

no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
01.04.2011, 15:20  [ТС]     не могу понять почему не работает std::sort() #12
Важно лишь то, чтобы они были в одной области видимости. Всё.
я имел в виду - удобно при чтения программы. вот описание класса - вот так с ним можно работать - вот так его можно сравнивать - все рядом. глазами не надо бегать. а не в плане корректности компиляции и выполнения.

разве можно привести int к объекту определенного класса? или это просто абстрактный пример?

Не по теме:

ну вот. ввернул слово explicit. теперь разбираться надо... =(

Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.04.2011, 15:35     не могу понять почему не работает std::sort() #13
C++
1
2
3
4
5
class Complex
{
public:
    Complex( int a=0, int b=0);
};
Объект класса Complex может быть неявно создан из int

Цитата Сообщение от no0ker Посмотреть сообщение
вот описание класса
Ещё и поэтому выносят функцию сравнения. Она не является описанием класса.)
no0ker
100 / 87 / 4
Регистрация: 17.12.2010
Сообщений: 416
01.04.2011, 19:11  [ТС]     не могу понять почему не работает std::sort() #14
Deviaphan, мда уж.. после некоторых экспериментов написал код, который очень удивил. и все таки int приводится.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class test{
    public:
        test(int _a=1, int _b=2) : a(_a), b(_b){}
        void show(){
            cout<<a<<" "<<b<<endl;
        }
    private:
        int a, b;
};
 
int main(){
    test t(4, 5);
    int a=3;
 
    t = a;
 
    t.show(); // выводит "3 2"
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2011, 19:27     не могу понять почему не работает std::sort()
Еще ссылки по теме:

[c++] fgets не могу понять почему это не работает C++
C++ Не могу понять почему не работает
Ребятки,выручайте,не могу понять почему не работает C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
01.04.2011, 19:27     не могу понять почему не работает std::sort() #15
Цитата Сообщение от no0ker Посмотреть сообщение
который очень удивил
Ничего удивительного.)
А если пред конструктором напишешь квалификатор explicit, то на строке 15 выдаст ошибку и потребуется явное создание объекта класса Test.
Ещё определи функции сравнения обоими способами (по очереди) и поэкспериментируй с ифом. Чтобы до конца убедиться.)
Yandex
Объявления
01.04.2011, 19:27     не могу понять почему не работает std::sort()
Ответ Создать тему
Опции темы

Текущее время: 12:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru