Std :: set все еще сортирует, когда элементы заключены в умные указатели?

Да, есть класс с перегруженным operator<

class Rectangle {
// ...
const inline bool operator< (const Rectangle &rhs) const {
return x < rhs.x || (x == rhs.x && y < rhs.y);
}
}

…делает set все еще используете эту перегрузку, когда элементы обернуты в умный указатель?

std::multiset<std::shared_ptr<Rectangle>> elements;

2

Решение

shared_ptr<T> разработан в качестве замены для замены T*так он ведет себя как:

std::multiset<Rectangle*> elements;

А именно, он будет сортировать по адресу памяти.

Если вы хотите использовать базовый operator<, вам нужно будет указать компаратор, который косвенно обращается и делает сравнение: [p,q]{*p < *q}

2

Другие решения

На самом деле, это тонко, но вы делаете не просто хочу добавить собственный компаратор к этому коду.

Вам нужно выбрать из один из этих вариантов кода имеет смысл:

  1. использование boost::ptr_multiset<Rectangle> (рекомендуемые)

  2. использование std::multiset<std::shared_ptr<const Rectangle>, YourCustomComparator>

В противном случае вы сможете изменить ключи, пока они находятся внутри карты (они не будут const), что ужасно и приведет вас к неопределенному поведению.

7

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector