对列表中的每个对象调用成员函数,以改变对象所在的列表
Invoking a member function on each object in a list that mutates the list the objects are in
当您迭代该列表时,您如何管理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()
有时会对列表重新排序,即我们使用上面的循环迭代的列表。
我不知道如何设计这个。 如何编写和调用成员函数Object::move()
,该函数可能在每次调用列表时对列表重新排序,并迭代objects
列表中的每个元素,在list
中的每个Object
上调用Object::move()
?
整体上。
将一个知道并操作容器的成员放在包含的对象中几乎普遍是一个糟糕的设计选择。 您需要容器>包含,但不包含>容器。
你的排序例程必须就是这样,一个排序例程,它使用"移动"的任何规则来决定何时交换东西。 当你对所有元素调用"move"时,你基本上是按某种条件对列表进行排序,所以你只是改变了元素移动自己的想法,它们被知道它们需要如何排序的东西移动。 当然,当您这样做时,对于不同的客户需求,条件可能会有所不同。
我想
我可以记住下一个应该是谁,在打电话之前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 ;
}
我可以在每个object
中设置一个moved
标志,然后再调用这个循环来false
,当调用Object::move
时,该标志将切换到true。 这样,如果对象在列表中移动到前面(没关系),并且如果对象在列表中移动到较晚的位置,则不会要求它::move
两次。 此外,这可确保要求每个对象至少移动一次,并消除了由于iter
在列表中向下移动而跳过对象的情况,从而++iter
跳过许多元素。
相关文章:
- 我使用向量来创建类对象列表.初始化向量时如何使用参数调用构造函数?
- 如何在不销毁对象的情况下返回对象列表
- 如何使用Q_PROPERTY公开自定义对象列表
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- c++ 循环访问对象列表并删除对象
- 循环访问对象列表 c++
- Cython正在获取C++对象列表的长度
- 如何在屏幕上显示对象列表?
- Strcmp 类行为应用于C++中的对象列表
- 如何迭代指针指向的对象列表?
- C++对象列表数组
- 使用BOOST :: PYTHON返回裸露的类对象列表,这些对象是不可复制的
- 返回对象列表
- C 链接对象列表
- 使用for_each从对象列表中调用打印功能
- 从对象列表中获取具有特定成员值的所有对象
- 按指针列出的 C++ 对象列表
- 子类对象列表重新解释为基类对象列表?(C++11).
- 在C++中的混合对象列表中使用相同的方法
- Python:我们应该如何编写一个函数来返回对象/列表和布尔标志