【问题标题】:C++ Iterator vs object with a length() methodC ++迭代器与具有长度()方法的对象
【发布时间】:2012-08-06 04:54:36
【问题描述】:

我的问题引用了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++ 习惯用法,总是出于一些我在这里不理解的额外原因创建迭代器。

【问题讨论】:

    标签: c++ iterator idioms


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 感谢您的信息。那么你会打赌这主要是在这组特定课程的情况下的便利吗?因为就像我建议的那样,我可以通过检查类型手动应用相同的过滤器操作,但它显然对我来说更多代码。我并不完全清楚 next 保护有害跳过元素的好处。
    • @jdi:也许方便和可读性是其中的一部分,但我会说它还强制执行一组更严格的规则并防止更多错误(尽管对于一个微不足道的例子,这可能并不明显) .
    猜你喜欢
    • 2017-12-18
    • 1970-01-01
    • 2018-06-10
    • 2011-01-07
    • 2014-01-01
    • 1970-01-01
    • 2022-10-19
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多