【问题标题】:C++ const_iterator not dereferencable?C++ const_iterator 不可取消引用?
【发布时间】:2013-11-09 01:37:49
【问题描述】:

我在尝试使用 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

【问题讨论】:

  • 它在 gcc 中运行良好,在插入一些 typename 之后也是如此。 Live Test
  • iter3iter1 指向 end 时,您可能会取消引用它们。
  • 即使这不是导致运行时错误的原因,typenametypename list&lt;T&gt;::const_iterator iter1; 中仍然是必需的。

标签: c++ const-iterator


【解决方案1】:

您可以循环超出范围。如果 iter1==iter2,但是 iter3!=iter4,下面的代码会 push_back(*iter1),虽然 iter1 已经是 l.end()。

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

【讨论】:

    【解决方案2】:

    您试图取消引用等于 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
    

    【讨论】:

      猜你喜欢
      • 2019-12-26
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 2011-05-27
      • 1970-01-01
      • 2018-02-01
      相关资源
      最近更新 更多