循环迭代器时引发"Debug assertion failed"错误



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

代码:

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++不太了解。如果能给我一个好的解释,我将不胜感激!

在while循环中,在使用迭代器之前先递增迭代器

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

这意味着两件事:

  • 跳过第一个元素
  • 迭代器到达end((,这是一个指向PAST-end-POSITION的指针,而不是一个有效的元素,请参阅此处

FIX循环结束时的增量,如

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

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

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

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

您可以在for循环中完成如下操作:

for ( ; piter != product.end() && cycler != star_rating.end(); ++piter, ++cycler) 
{ // ^^                                                       ^^^^^^^^^^^^^^^^^^
cout << "/n|" << *piter << "|" << *cycler << " Stars";
}

最新更新