2012-05-12 59 views
6

對於下面的代碼中,我得到了錯誤的標題行錯誤:「不匹配的運營商+」,爲列表迭代器

while((*(It2 + code)).exists){ 


void locatetohashtable(std::list<Element> elist, 
         int *m,std::list<Element>& table, 
         std::list<std::string>& keylist) 
{   
    std::list<Element>::iterator It2=table.begin(); 
    int i=0; 
    int k=0; 
    std::list<Element>::iterator It; 
    for(It = elist.begin(); It != elist.end(); ++It) 
    { 
     int code=hash_func(stringIntValue((*It).name),*m,i); 
     while((*(It2 + code)).exists){ 
      i++; 
     } 
     table.insert(*(It2+i), (*It)); 
     keylist.insert(keylist.begin(),(*It).name); 
     k++; 
    } 
} 

我沒有得到同樣的錯誤爲++It

有什麼問題?

回答

11

std::listiterator是雙向的,所以它不支持+(int)。唯一支持的移動操作是++--

4

std::list迭代器只是雙向的,而不是隨機訪問,所以你不能使用運算符+來推進它們。改爲使用std::next(C++ 11)或std::advance

9

這是因爲std::list的迭代器是bidirectional iterators,所以它們不支持您嘗試執行的加法操作。實際上,這是因爲它不能作爲一個有效的操作來實現,因爲列表不提供隨機訪問,所以你必須從初始迭代器到目標單步增量。設計決定是不提供一個低效率的操作。

您可以使用std::advancestd::next來避免編寫您自己的增量循環,但是在引擎蓋下它會逐步增加。

2

這是「概念」的問題。

A list只能有效地遍歷forward and backward,因此它的迭代器模擬雙向迭代器概念。

您可以使用std::advance一次將迭代器移動幾個位置,但效率不高。

或者您可以更改爲使用vectordeque而不是列表。由於它們是Random Access容器,因此它們的迭代器可以高效地支持加法和減法。