пользовательский тип данных в наборе в C ++ - PullRequest
0 голосов
/ 06 октября 2019

В первом случае код работает нормально, но я получаю сообщение об ошибке во втором коде, единственное отличие состоит в «const» в перегрузке оператора «<», я не могу понять, почему. Код для обоих случаев ниже 1. </p>

class first
{
    public:
    int y;
    bool operator < (first t) const
    {
        return (y>t.y);
    }
};
set<first> f;

2.

class first
{
    public:
    int y;
    bool operator < (first t) 
    {
        return (y>t.y);
    }
}; 
set<first> f;

Ответы [ 2 ]

4 голосов
/ 06 октября 2019

Компаратор по умолчанию для std::set равен std::less<Key>, и, как мы видим на std::less, он определяет:

constexpr bool operator()( const T& lhs, const T& rhs ) const;

, который принимает constаргументы и возвращает lhs < rhs. Это, конечно, не работает, если lhs < rhs недопустимо для константных аргументов, как это происходит во втором случае, потому что bool operator < (first t) не может быть вызван.


Написание собственного компаратора, который принимает неКажется, что аргументы const тоже не работают, поэтому, похоже, это требование заказанного контейнера, но для подтверждения необходима дополнительная проверка со стандартом.

0 голосов
/ 06 октября 2019

std::set, как и большинство других контейнеров в стандартной библиотеке, использует требование Compare для своей функции сравнения. А требование Compare обеспечивает константность:

Как и в случае любого BinaryPredicate, вычисление этого выражения не позволяет вызывать неконстантные функции через разыменованные итераторы.

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