假设我已经分配了一些内存,并且已经填充了一组相同类型的对象,我们将称之为这些组件。
假设需要删除其中一个组件,这样做的好方法是,组件创建的“漏洞”可以通过循环迭代对象集来测试和跳过吗?
逆也应该是真的,我希望能够测试一个洞,以便在空间中存储新的组件。
我在想男人&检查0 ...
答案 0 :(得分:3)
boost::optional<component>
似乎完全符合您的需求。把它们放在你的存储器中,无论发生什么。例如,使用std::vector
// initialize the vector with 100 non-components
std::vector<boost::optional<component>> components(100);
// adding a component at position 15
components[15].reset(component(x,y,z));
// deleting a component at position 82
componetnts[82].reset()
// looping through and checking for existence
for (auto& opt : components)
{
if (opt) // component exists
{
operate_on_component(*opt);
}
else // component does not exist
{
// whatever
}
}
// move components to the front, non-components to the back
std::parition(components.begin(), components.end(),
[](boost::optional<component> const& opt) -> bool { return opt; });
答案 1 :(得分:0)
简短的回答取决于你如何将它存储在memmory中。
例如,ansi标准建议将矢量连续分配。
如果可以预测对象的大小,则可以使用size_of和寻址等函数来预测内存中的位置。
祝你好运。答案 2 :(得分:0)
至少有两种解决方案:
1)用一些标记标记孔,然后在处理时跳过它。好处:'删除'非常快(只设置一个标志)。如果对象不是那么小,即使添加“bool alive”标志也不是那么难。
2)在池的末端移动一个洞并用一些“活着的”物体替换它。
这个问题与存储和处理粒子系统有关,你可以在那里找到一些建议。
答案 3 :(得分:0)
如果无法向上移动“实时”组件,或者对它们重新排序,使得序列中间没有孔,那么最好的选择是给组件对象一个“已删除”标志/状态可以通过会员功能进行测试 这样一个“删除”的状态确实不导致对象从内存中移除(这在一个更大的块的中间是不可能的),但它确实可以将该点标记为不正在使用一个组件。
答案 4 :(得分:0)
当你说你“分配了一些内存”时,你可能正在谈论一个阵列。数组非常棒,因为它们几乎没有开销,索引速度非常快。但阵列的坏处在于它们对于调整大小并不是很友好。当您删除中间的元素时,所有后续元素都必须向后移动一个位置。
但幸运的是,您可以使用其他数据结构,例如linked list或binary tree,可以快速删除元素。 C ++甚至在容器类std::list和std::set中实现了这些。
当您事先不知道需要多少元素时,列表很棒,因为它可以在您移除或添加任何元素时动态缩小和增长而不会浪费任何内存。此外,添加和删除元素非常快,无论您是在开头,最后还是在中间某处插入它们。
一套很适合快速查找。当你有一个对象而你想知道它是否已经在集合中时,检查它是非常快的。集合还会自动丢弃重复项,这在许多情况下非常有用(当您需要重复项时,有std::multiset)。就像列表一样,它会动态调整,但添加新对象的速度不如列表中那么快(不像数组那样昂贵)。
答案 5 :(得分:0)
两个建议:
1)您可以使用Linked List存储组件,然后不用担心漏洞。
或者如果您需要这些漏洞:
2)您可以将组件包装到具有指向组件的指针的对象中,如下所示:
class ComponentWrap : public
{
Component component;
}
并使用ComponentWrap.component == null
查找组件是否已删除。
例外方式:
3)将代码放在try catch块中,以防你遇到空指针错误。