2013-10-29 36 views
1

嘗試使用const_iterators時出現運行時錯誤。錯誤是:列表迭代器不可取消。我明白const_iterator不能被解除引用給列表中的值,但我想解引用迭代器訪問列表中的值。我正在使用Visual Studio 2010專業版。C++ const_iterator不能取消引用?

我已經研究了這一點,但還沒有找到任何能幫助我理解我做錯了什麼的東西。

#include <list> 
#include <iostream> 

using namespace std; 

template <typename T> 
list<T> interleaveLists(const list<T>& l, const list<T>& m) 
{ 
    list<T> interleavedList; 
    list<T>::const_iterator iter1; 
    list<T>::const_iterator iter2; 
    list<T>::const_iterator iter3; 
    list<T>::const_iterator iter4; 

    iter1 = l.begin(); 
    iter2 = l.end(); 
    iter3 = m.begin(); 
    iter4 = m.end(); 

    while (iter1 != iter2 || iter3 !=iter4) 
    { 
    interleavedList.push_back(*iter1); 
    interleavedList.push_back(*iter3); 
    iter1++; 
    iter3++; 

    if (iter1 == iter2) 
    { 
     interleavedList.push_back(*iter3); 
    } 

    if (iter3 == iter4) 
    { 
     interleavedList.push_back(*iter1); 
    } 
    } // end while 
    return interleavedList; 
} //end interleaveLists 

//****************************************************************** 

int main() 
{ 
    list<int> list1; 
    list<int> list2; 
    list<int> list3; 
    list<int> newList; 

    // Create list1 = {40, -5, 66, -7, 8} 
    list1.push_back(40); 
    list1.push_back(-5); 
    list1.push_back(66); 
    list1.push_back(-7); 
    list1.push_back(8); 

    // Create list2 = {22, 3, -4} 
    list2.push_back(22); 
    list2.push_back(3); 
    list2.push_back(-4); 

    newList = interleaveLists(list1, list2); 
    while (!newList.empty()) 
    { 
    cout << newList.front() << " "; 
    newList.pop_front(); 
    } 
    cout << endl; 

    newList = interleaveLists(list3, list2); 
    while (!newList.empty()) 
    { 
    cout << newList.front() << " "; 
    newList.pop_front(); 
    } 
    cout << endl; 
} // end main 
+2

它在gcc中工作正常,插入一些'typename'後也是如此。 [Live Test](http://coliru.stacked-crooked.com/a/4245aeaa99241186) – deepmax

+0

當他們指向'end'時,您可能會取消引用iter3或iter1。 –

+2

即使這不是運行時錯誤的原因,'typename'仍然需要在'typename list :: const_iterator iter1;'中。 – AnT

回答

2

您可以循環超出範圍。如果iter1 == iter2,但是iter3!= iter4,則下面的代碼將push_back(* iter1),儘管iter1已經是l.end()。

while (iter1 != iter2 || iter3 !=iter4) 
{ 
    interleavedList.push_back(*iter1); 
    interleavedList.push_back(*iter3); 
0

您試圖取消引用等於end()的迭代器的問題。

while (iter1 != iter2 || iter3 !=iter4) 
    { 
    interleavedList.push_back(*iter1); // here is invalid code 
    interleavedList.push_back(*iter3); // here is invalid code 
    iter1++; // here is invalid code 
    iter3++; // here is invalid code