错误窗口立即弹出,程序崩溃等。
代码:
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";
}