C ++ Iterator与具有length()方法的对象

时间:2012-08-09 01:03:13

标签: c++ iterator idioms

我的问题引用了Maya C++ API中的一个例子,我想知道它是否特定于Maya或一般的C ++习语

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

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

示例...

MSelectionList

MSelectionList activeList;
MGlobal::activeSelectionList(activeList);

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

MItSelectionList

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

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

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

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

1 个答案:

答案 0 :(得分:2)

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

根据wikipedia article for iterators,迭代器具有以下优点:

  
      
  • 计数循环尤其不适用于所有数据结构   没有或慢的随机访问的数据结构,如列表或树。
  •   
  • 迭代器可以提供一致的方法来迭代数据结构   所有类型,因此使代码更具可读性,可重用性和   对数据结构的变化不太敏感。
  •   
  • 迭代器可以   对访问实施额外限制,例如确保访问   不能跳过元素或以前访问过的元素可以   不能第二次访问。
  •   
  • 迭代器可以允许容器   要修改的对象而不使迭代器失效。例如,   一旦迭代器超越了它可能的第一个元素   可以在其开头插入其他元素   具有可预测结果的容器。使用索引这是有问题的   因为索引号必须改变。
  •   

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