【问题标题】:Microsoft VS c++ 2010 list iterator errorMicrosoft VS c++ 2010 列表迭代器错误
【发布时间】:2015-05-29 05:16:55
【问题描述】:

我有一个列表迭代器不可增加的问题 我有一个邻接矩阵“adj(2d 向量)”+我有一个名称颜色的 char 向量,我有一个 int glist 我在使用以下功能时遇到问题

 for(list<int>::iterator it = glist.begin(); it != glist.end(); it++)
    {
        int x =0;
    for(int i=0;i<adj.at(*it).size();i++){
        if(color.at(adj.at(*it).at(i)) == 'w')
         x++;
    }
        if(x == 0)
        {
            it = glist.erase(it);
        }
    }

我想要从这个函数中测试 glist 中每个元素的邻居是否具有白色的邻居(即颜色向量中邻居的颜色 == "w",如果没有,则删除元素从清单中 但是当我编译 list iterator not incrementable 的错误时出现 任何帮助将不胜感激

【问题讨论】:

  • 如果有人想让我发布整个代码,请告诉我,我会发布它
  • 对不起,如果我的问题没有很好地形成,我下次会尝试改进它

标签: c++ list vector iterator


【解决方案1】:

当您删除一个项目时,您的逻辑会跳过列表中的一个项目。

假设你有:

1 5 15 222

在您的列表中。假设您结束从列表中删除5。行:

if(x == 0)
{
    it = glist.erase(it);
}

将使it 指向15。你在for 行中执行++it,这使得it 指向222。这意味着您跳过了处理15

如果您最终删除 222,则以下行:

if(x == 0)
{
    it = glist.erase(it);
}

将使it 指向glist.end()。当您对此执行 ++it 时,您将看到未定义的行为。

使用以下方法更改您的逻辑以更新it

if(x == 0)
{
    it = glist.erase(it);
}
else
{
    ++it;
}

并将for 行更改为:

for(list<int>::iterator it = glist.begin(); it != glist.end(); /* it++ /*)
                                                               // ^^^^ Don't need.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-05
    • 2015-05-19
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多