【发布时间】:2020-08-09 10:08:55
【问题描述】:
我正在使用 std::multiset 指向对象的指针来在我的游戏中实现 Z 排序,因此我不需要在每次插入时对结构进行排序。我使用比较器按对象的深度插入:
struct rendererComparator
{
bool operator ()(const Renderable* r1, const Renderable* r2) const
{
return r1->depth < r2->depth;
}
};
std::multiset<Renderable*, rendererComparator> m_Renderables;
但是,当涉及到擦除多重集中的元素时,对erase 的调用会删除所有具有相同深度的元素,这是不可取的。我尝试了这个问题的建议:In std::multiset is there a function or algorithm to erase just one sample (unicate or duplicate) if an element is found 但是
auto iterator = m_Renderables.find(renderable);
if (iterator != m_Renderables.end())
{
m_Renderables.erase(renderable);
}
由于比较器,仍然会擦除所有具有相同深度的元素。
是否可以在没有 boost 的情况下为 std::multiset 定义 2 个比较器? (How can I set two kind of comparator (one for insert, one for find) on this multiset?) 一个用于插入,一个用于比较?
谢谢
编辑:Jignatious 指出我没有擦除迭代器(我的错字)。我通过使用std::find_if解决了它
auto iterator = std::find_if(m_Renderables.begin(), m_Renderables.end(), [renderable](const Renderable* r1) { return r1 == renderable; });
if (iterator != m_Renderables.end())
{
m_Renderables.erase(iterator);
}
【问题讨论】:
标签: c++ pointers set std multiset