vector erase 重复删除容器内的指定内容时,使用迭代器(iterator)++的操作应该放到For循环内

来源:互联网 发布:sql server 2016 安装 编辑:程序博客网 时间:2024/04/30 22:29

在使用Vector重复删除容器内的指定内容时,迭代器(iterator)++的操作应该放到For循环内,而不应该放在for循环上。

具体详见代码:

  vector<string> vTempNo;
  string temp = "   1 2 3 4     ";
  for (int i = 0; i < temp.length(); i++)
  {
    vTempNo.push_back(temp.substr(i, 1));
  }
  for (std::vector<std::string>::iterator iter = vTempNo.begin(); iter != vTempNo.end();iter++)
  {
    if (*iter == " ")
    {
      iter = vTempNo.erase(iter);
    }

    if (iter == vTempNo.end()) //要控制迭代器不能超过整个容器
    {
      break;
    }
  }

  for (std::vector<std::string>::iterator iter = vTempNo.begin(); iter != vTempNo.end(); iter++)
  {
    cout << *iter << endl;
  }

输出结果:

空格

1

2

3

4

空格

空格

原因:erase函数生效时,返回下一个迭代器,这时For循环再对迭代器加1,造成判断遗漏。

修改方法:

 vector<string> vSeatLineNo;
  string temp = "   1 2 3 4     ";
  for (int i = 0; i < temp.length(); i++)
  {
    vSeatLineNo.push_back(temp.substr(i, 1));
  }
  for (std::vector<std::string>::iterator iter = vSeatLineNo.begin(); iter != vSeatLineNo.end();)
  {
    if (*iter == " ")
    {
      iter = vSeatLineNo.erase(iter);
    }
    else
    {
      iter++;
    }

    if (iter == vSeatLineNo.end()) //要控制迭代器不能超过整个容器
    {
      break;
    }
  }


  for (std::vector<std::string>::iterator iter = vSeatLineNo.begin(); iter != vSeatLineNo.end(); iter++)
  {
    cout << *iter << endl;
  }

原创粉丝点击