Я бы подумал поменять дизайн. например. что не так с использованием встроенной функции языка?
std::map<int, frame> frames_;
frames_.emplace(id);//adding, ie. creating frames
frames_.erase(id)//removing, ie. deleting frames
Теперь создание / удаление так же просто, как и раньше. По совпадению, если кому-то нужна рамка для другой цели, здесь нет проблем. Если предполагается, что frame это полиморф c, вы можете хранить std::unique_ptr
вместо
. Также я хотел бы рассмотреть вопрос о том, чтобы сделать id
членом frame, а затем сохранить в std::set
вместо std :: map. .
class frame
{
public:
int id;
frame(int id);
friend bool operator <(const frame& lhs, const frame& rhs) {return lhs.id < rhs.id;}
};
std::set<frame> frames_;
Удаление - это просто:
frames_.erase(frame);
Однако теперь поиск по идентификатору несколько сложнее. К счастью, есть решение под рукой. Это требует реализации прозрачного сравнения, которое, среди прочего, включает определение is_transparent
.
В целом вам необходимо подумать о владении. Спросите себя: где или кому будет принадлежать / хранить карту / указатели кадров / et c. Храните это там. В случае совместного владения используйте shared_ptr
(но используйте только этот шаблон, когда это действительно необходимо - что более редко, чем то, для чего его используют люди).
Некоторые соответствующие основные рекомендации
I.3 Избегать одиночных вызовов
R.5 и R.6 Избегайте неконстантных глобальных переменных
R.11 Избегайте вызова new и явно удаляйте
R.20 и R.21 Предпочитайте unique_ptr перед shared_ptr если вам не нужно делиться собственностью