C++ &引用;“调试断言失败”;循环迭代器时引发错误

C++ &引用;“调试断言失败”;循环迭代器时引发错误,c++,iterator,stdvector,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();

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

代码:

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";
  }
}
void sort\u star(向量和乘积、向量和星级)
{
向量::迭代器piter;
向量::迭代器循环器;
piter=product.begin();
cycler=star_rating.begin();
while(piter!=product.end()&cycler!=star_rating.end())
{
++piter;++循环器;

不能在递增之后取消对迭代器的引用。这将

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

    将迭代器返回到
    容器。此元素用作占位符;正在尝试
    访问它会导致未定义的行为

您可以在for循环中完成它,如下所示:

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

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

在while循环中,可以在使用迭代器之前增加迭代器的数量

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

++piter;++cycler;在使用迭代器之前增加迭代器,它可能等于end(),这不是有效元素的句柄。使用迭代器后递增。欢迎这样做!您的问题比我看到的许多第一次提出的问题都写得好,而且非常独立。但请注意代码布局。稍微努力一点会有很大帮助。当您编辑代码并使用它时,难免会出现一些混乱,但为什么不进行修改呢不管怎么说,在你发帖之前它看起来不错?这表明了你的努力,从而表明了你对论坛的尊重!我们软件工程师对琐碎的事情很敏感。想想看:好的演说家在演讲中会有经过精心计算的停顿,好的程序员会使用一致的间隔来让代码更具可读性。我们用代码交谈,所以这是一样的!:)好的,这很有效。但是在这种情况下,for循环会更有效吗?我以前尝试过,但无法获得与我这样做时相同的结果。当意识到我已经分配了迭代器时,Facepalmed,lol。当然可以使用for循环。但是while循环也没有问题。没有性能增益。将while()与for()进行比较。它们产生相同的代码。@Gabe没有区别。但是,建议的方法也将打印向量的第一个元素。(如果不想打印,请从
vec.begin()+1开始)
while (piter != product.end() && cycler != star_rating.end()) {
    cout << "/n|" << *piter << "|"; 
    cout << *cycler << " Stars";

    ++piter; ++cycler;
}