Мой вопрос относится к примеру из Maya C++ API, и я интересно, относится ли это к Maya или к общей идиоме C++
В API Maya есть объект с именем MSelectionList
, который представляет собой контейнер, представляющий объекты на сцене. У него также есть компаньон MItSelectionList
, который является итератором для экземпляра MSelectionList
.
Теперь я понимаю, что преимущество итератора заключается в том, что он знает, как правильно перебирать объект, но в этом случае MSelectionList
имеет метод .length()
, а также те же геттеры, что и итератор, за исключением того, что вы предоставляете индекс.
Пример...
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, или это общая идиома С++, чтобы всегда создавать итераторы по какой-то дополнительной причине, которую я здесь не понимаю.