嘗試使用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
它在gcc中工作正常,插入一些'typename'後也是如此。 [Live Test](http://coliru.stacked-crooked.com/a/4245aeaa99241186) – deepmax
當他們指向'end'時,您可能會取消引用iter3或iter1。 –
即使這不是運行時錯誤的原因,'typename'仍然需要在'typename list :: const_iterator iter1;'中。 –
AnT