我的问题引用了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 ++习惯用法总是创建迭代器,这是因为我不理解这里的一些额外原因。
答案 0 :(得分:2)
我不熟悉Maya,但我相信这个问题与“迭代器与索引”之间的争论有关。
根据wikipedia article for iterators,迭代器具有以下优点:
- 计数循环尤其不适用于所有数据结构 没有或慢的随机访问的数据结构,如列表或树。
- 迭代器可以提供一致的方法来迭代数据结构 所有类型,因此使代码更具可读性,可重用性和 对数据结构的变化不太敏感。
- 迭代器可以 对访问实施额外限制,例如确保访问 不能跳过元素或以前访问过的元素可以 不能第二次访问。
- 迭代器可以允许容器 要修改的对象而不使迭代器失效。例如, 一旦迭代器超越了它可能的第一个元素 可以在其开头插入其他元素 具有可预测结果的容器。使用索引这是有问题的 因为索引号必须改变。
对于您的特定示例,看起来第三个项目符号最适用,因为MItSelectionList
仅公开next()
成员函数以强制不跳过元素(除非应用过滤器)。< / p>