1

std::list当您遍历该列表时,您如何管理其中的对象需要移动它们的位置,甚至从该列表中删除它们自己的情况?

下面是一个复杂的例子。

你有一个有序 list的对象。

list< Object* > objects ;

你有一个循环遍历每个

for( list< Object* >::iterator iter = objects.begin() ; iter != objects.end() ; ++iter )
{
    // call "move()" on each
    (*iter)->move() ;
}

现在这是问题所在。 Object::move()有时会重新排序 list,也就是我们用上面的循环迭代的那个列表。

我不知道如何设计这个。如何编写和调用一个成员函数Object::move(),每次调用它时都可能重新排序列表,并遍历列表中的每个元素objects,调用?Object::move()Objectlist

4

2 回答 2

3

整体上。

在包含的对象中放置一个知道和操作容器的成员几乎是一个糟糕的设计选择。你想要容器->包含但不包含->容器。

您的排序例程将必须是这样,一个排序例程使用任何“移动”规则,否则将用于决定何时交换事物。当您在其所有元素上调用“移动”时,您基本上是按某种条件对列表进行排序,因此您只需将元素移动到它们被知道如何排序的东西移动的想法改变。当然,当您这样做时,对于不同的客户需求,条件可能会有所不同。

于 2012-12-09T21:35:36.773 回答
0

我想我可以在打电话之前记住下一个应该是 ,并且总是使用它。move()

for( list< Object* >::iterator iter = objects.begin() ; iter != objects.end() ; )
{
    // call "move()" on each
    list< Object* >::iterator shouldBeNext = iter ;
    ++shouldBeNext ;

    (*iter)->move() ;

    iter = shouldBeNext ;
}

在调用这个循环之前,我可以moved在每个内部设置一个标志,当被调用时,该标志被切换为真。这样,如果对象在列表中移动较早(没关系),并且如果对象在列表中移动较晚,则不会被要求两次。这也确保了每个对象都被要求至少移动一次,并消除了由于在列表中向下移动而跳过许多元素而导致对象被跳过的情况。objectfalseObject::move::moveiter++iter

于 2012-12-09T21:38:39.237 回答