2

我的问题引用了Maya C++ API的一个示例,我想知道它是特定于 Maya 还是通用 C++ 习惯用法

在 Maya API 中有一个名为 的对象MSelectionList,它是一个容器,表示场景中的对象。它还有一个同伴MItSelectionList,它是MSelectionList实例的迭代器。

现在我明白了迭代器的好处是它知道如何正确地循环对象,但在这种情况下,它MSelectionList有一个.length()方法,以及与迭代器相同的 getter,除了你提供索引。

例子...

选择列表

MSelectionList activeList;
MGlobal::activeSelectionList(activeList);

unsigned int length = activeList.length();
for (unsigned int i=0 ; i < length; i++ ) {
    MDagPath item;
    iter.getDagPath(i, item);
}

选择列表

MSelectionList activeList;
MGlobal::activeSelectionList(activeList);
MItSelectionList iter( activeList );

for ( ; !iter.isDone(); iter.next() ) {
    MDagPath item;
    iter.getDagPath(item);
}

迭代器在普通选择对象上提供的唯一功能是设置过滤器类型的能力,以便它只返回与过滤器匹配的对象。尽管您可以在第一个示例中明确执行相同的测试。

我的问题是,当迭代器和原始对象之间的功能重叠时,迭代器有什么好处?这只是一个特定于 Maya 的设计决策,还是一个通用的 C++ 习惯用法,总是出于一些我在这里不理解的额外原因创建迭代器。

4

1 回答 1

2

我对 Maya 不熟悉,但我相信这个问题与“迭代器与索引”之间的争论有关。

根据迭代器的维基百科文章,迭代器具有以下优点:

  • 计数循环不适用于所有数据结构,特别是对于没有随机访问或随机访问速度较慢的数据结构,如列表或树。
  • 迭代器可以提供一种一致的方式来迭代各种数据结构,从而使代码更具可读性、可重用性,并且对数据结构的变化不那么敏感。
  • 迭代器可以对访问施加额外的限制,例如确保元素不能被跳过或以前访问过的元素不能被第二次访问。
  • 迭代器可以允许在不使迭代器无效的情况下修改容器对象。例如,一旦迭代器超出了第一个元素,就有可能将其他元素插入容器的开头,并产生可预测的结果。使用索引这是有问题的,因为索引号必须更改。

对于您的特定示例,看起来第三个项目符号最适用,因为MItSelectionList仅公开一个next()成员函数以强制不跳过元素(除非应用了过滤器)。

于 2012-08-09T01:49:46.750 回答