Имея набор указателей на уникальные объекты типа A
, я хочу создать и вставки новый элемент в наборе, но только если нет такого элемент уже. Проблема заключается в том, что стандартные компараторы работают с существующими объектами, а один еще не существует. Это означает, что я не могу определить, находится ли объект в наборе без создания объекта (или без повторного набора всего набора вручную).Создать объект, если он еще не в наборе
Одним из очевидных решений было бы заменить набор на карту с ключами, содержащими часть A
, что делает объекты типа A
уникальными, но это почти удваивает использование памяти. Это неприемлемо для меня.
Любые идеи?
ОБНОВЛЕНИЕ Чтобы быть более конкретным, здесь приведен упрощенный пример:
class Base { /* members */ };
class Derived : public Base {
static std::set<Derived *> cache;
std::vector<Object *> v;
public:
static Derived *Create(const std::vector<Object *> &v);
/* other members */
};
Derived *Derived::Create(const std::vector<Object *> &v) {
/* Here I need to create and insert a new object of type Derived
into the `Derived::cache`, but only if there is no such object
in the set yet. Objects are uniqued by contents of `v`. */
}
Посмотрите на ['std :: find_if()'] (http://en.cppreference.com/w/cpp/algorithm/find) для поиска существующего объекта. Если не найден, создайте + вставить новый объект. –
'стандартные компараторы работают с существующими объектами, а один еще не существует. Извините, я не понимаю. Почему вы не можете реализовать 'operator <' снова? –
Как @BryanChen сказал - просто определите свой собственный оператор сравнения. – pstrjds