簡體   English   中英

C ++ const_iterator是否不可引用?

[英]C++ const_iterator not dereferencable?

嘗試使用const_iterators時出現運行時錯誤。 錯誤是:列表迭代器不可引用。 我知道const_iterator不能被取消引用以將值分配給列表,但是我試圖取消引用迭代器以訪問列表中的值。 我正在使用Visual Studio 2010專業版。

我對此進行了相當多的研究,但沒有發現任何可以幫助我了解自己在做錯事情的事情。

#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

您可以超出范圍。 如果iter1 == iter2,但是iter3!= iter4,則以下代碼將為push_back(* iter1),盡管iter1已經是l.end()。

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

您試圖取消引用等於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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM