2012-08-09 57 views
2

我的問題從Maya C++ API引用的示例和我想知道如果它是特定於Maya或大致C++成語C++迭代器VS具有長度()方法對象

在瑪雅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); 
} 

迭代器提供了對正常選擇對象的唯一事情是設置一個的能力過濾器類型,所以它只會ret與過濾器匹配的對象。儘管您可以在第一個示例中明確執行相同的測試。

我的問題是當迭代器和原始對象之間的功能存在重疊時,迭代器的好處是什麼?這只是一個特定於Maya的設計決定,還是總是爲了一些額外的原因而創建迭代器的一般C++慣用法,這是我在這裏不理解的。

回答

2

我對Maya並不熟悉,但我相信這個問題與「迭代器與索引」之間的爭論有關。

按照wikipedia article for iterators,迭代器具有以下優點:

  • 計數循環是不適合所有的數據結構,特別是 與沒有或慢速隨機存取數據結構,如列表或樹。
  • 迭代器可以提供一致的方式來迭代所有類型的數據結構 ,並因此使代碼更具可讀性,可重用性,並且對數據結構中的更改不太敏感。
  • 迭代器可以對訪問執行其他限制,例如確保 元素不能被跳過或先前訪問過的元素不能再次訪問 。
  • 迭代器可以允許在不使迭代器失效的情況下修改容器 對象。例如, 一旦迭代器超出第一個元素,它可能是 可能插入額外的元素到 容器的開始,並具有可預測的結果。由於索引編號必須改變,索引編號有問題 。

爲了您的具體實例中,它看起來像第三子彈是最適用的,因爲僅MItSelectionList暴露出next()成員函數來強制執行該元件不跳過(除非應用過濾器)。

+0

感謝您的信息。那麼你會打賭,這對於這組特定的類來說大多是一種便利嗎?因爲正如我所建議的那樣,我可以通過檢查類型來手動應用相同的過濾操作,但對於我來說,它顯然是更多的代碼。我不清楚「next」保護元素有害跳過的好處。 – jdi 2012-08-09 01:56:57

+0

@jdi:或許便利性和可讀性是其中的一部分,但我會說它也強制執行更嚴格的規則並防止更多的錯誤(儘管對於一個微不足道的例子來說,這可能並不明顯)。 – 2012-08-09 02:07:21