循环迭代器时引发“调试断言失败”错误

时间:2018-12-14 06:21:32

标签: c++ iterator stdvector

立即弹出错误窗口,程序崩溃等。

代码:

void sort_star(vector<string>& product, vector<double>& star_rating) 
{
  vector<string>::iterator piter;
  vector<double>::iterator cycler;
  piter = product.begin();
  cycler = star_rating.begin();

  while (piter != product.end() && cycler != star_rating.end()) 
  {
    ++piter; ++cycler;

    cout << "/n|" << *piter << "|"; 
    cout << *cycler << " Stars";
  }
}

是的,所以我很新,对C ++不太了解。一个很好的解释将不胜感激!

2 个答案:

答案 0 :(得分:4)

在while循环中,您在使用迭代器之前先对其进行递增

...
while (piter != product.end() && cycler != star_rating.end()) {
    ++piter; ++cycler; <--- HERE

这意味着两件事:

  • 您跳过第一个元素
  • 您的迭代器到达end(),该指针是PAST-END-POSITION的指针,而不是有效元素see here

FIX 像这样在循环结束时增加:

while (piter != product.end() && cycler != star_rating.end()) {
    cout << "/n|" << *piter << "|"; 
    cout << *cycler << " Stars";

    ++piter; ++cycler;
}

答案 1 :(得分:2)

您要在递增后取消引用迭代器。这将

  • 跳过要打印的第一个元素
  • 将尝试取消引用std::vector::end迭代器。 明显 std::vector::end

      

    将迭代器返回到
    的最后一个元素之后的元素   容器。此元素充当占位符;试图
      访问它会导致未定义的行为

您本可以在for循环中完成此操作,如下所示:

for ( ; piter != product.end() && cycler != star_rating.end(); ++piter, ++cycler) 
{ // ^^                                                       ^^^^^^^^^^^^^^^^^^

    cout << "/n|" << *piter << "|" << *cycler << " Stars";
}