gpt4 book ai didi

C++ 迭代器与具有 length() 方法的对象

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:54:33 25 4
gpt4 key购买 nike

我的问题引用了 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++ 习惯用法。

最佳答案

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

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

  • Counting loops are not suitable to all data structures, in particular to data structures with no or slow random access, like lists or trees.
  • Iterators can provide a consistent way to iterate on data structures of all kinds, and therefore make the code more readable, reusable, and less sensitive to a change in the data structure.
  • An iterator can enforce additional restrictions on access, such as ensuring that elements can not be skipped or that a previously visited element can not be accessed a second time.
  • An iterator may allow the container object to be modified without invalidating the iterator. For instance, once an iterator has advanced beyond the first element it may be possible to insert additional elements into the beginning of the container with predictable results. With indexing this is problematic since the index numbers must change.

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

关于C++ 迭代器与具有 length() 方法的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11875386/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com