Контейнер хранит уникальные объекты (указатели на объекты), но при этом они должны быть отсортированны по определённому критерию. Если критерии для двух объектов равны, то добавленный позднее объект должен находится последним.
Я завелосипедил свой класс, но, может быть, есть что получше (т.к. здесь, например, при изменении значения по итератеру поломается порядок).
template <typename T, class Comp>
class ordered_set
{
public:
ordered_set()
{
}
template <typename _T>
void insert(_T&& elem)
{
erase(elem);
Comp comp;
auto it = std::find_if(m_elems.begin(), m_elems.end(),
[&](const auto& e) { return comp(elem, e); });
m_elems.insert(it, std::forward<_T>(elem));
}
template <typename ...Args>
void emplace(Args&&... args)
{
insert(T{std::forward<Args>(args)...});
}
auto erase(typename std::deque<T>::const_iterator it)
{
return m_elems.erase(it);
}
size_t erase(const T& elem)
{
size_t old_size = size();
m_elems.erase(std::remove_if(m_elems.begin(), m_elems.end(),
[&](const auto& e) { return e == elem; }),
m_elems.end());
return size() - old_size;
}
auto find(const T& elem)
{
return std::find_if(m_elems.begin(), m_elems.end(),
[&](const auto& e) { return e == elem; });
}
void clear()
{
m_elems.clear();
}
auto size() const
{
return m_elems.size();
}
auto begin()
{
return m_elems.begin();
}
auto end()
{
return m_elems.end();
}
auto elements() const
{
return m_elems;
}
private:
std::deque<T> m_elems;
};