在C ++中使用字符串迭代器的无限循环

时间:2011-02-18 18:28:57

标签: c++ iterator infinite-loop

虽然我愿意解析字符串中包含的指令,但我基本上是想从它的空格和制表符字符中清除一个字符串,以便在其中查找指令。 不幸的是,我的循环进入了一个无限循环,我无法找到原因,因为我在每次删除char时刷新迭代器...

请帮忙吗?

void  myClass::parseInstructions(std::string& line)
{
    std::string::iterator        it;

    for (it = line.begin(); it != line.end(); ++it)
        if (((*it) == ' ') || ((*it) == '\t'))
            it = line.erase(it);
}

2 个答案:

答案 0 :(得分:12)

您的代码流程:

it = line.begin(); 
while (it != line.end()) {
    if (((*it) == ' ') || ((*it) == '\t'))
        it = line.erase(it);
    ++it;
}

正确的代码:

it = line.begin(); 
while (it != line.end()) {
    if (((*it) == ' ') || ((*it) == '\t'))
        it = line.erase(it);
    else // <---- THIS IS IMPORTANT
        ++it;
}

现在你会连续错过两个空白字符,当最后一个字符是空格时,你会移动到最后。

或者您可以使用std::remove_copy_if,其复杂程度要低得多。

答案 1 :(得分:2)

C ++ 0x解决方案:

void  myClass::parseInstructions(std::string& s)
{
      std::string::iterator end = std::remove_if(s.begin(),s.end(),[](char c){ return c==' ' || c == '\t'; });
      s.erase(end, s.end());
}

仅移除ahttp://www.ideone.com/hgnCN

的演示

C ++ 03解决方案

bool predicate(char c) { return c==' ' || c == '\t'; }
void  myClass::parseInstructions(std::string& s)
{
      std::string::iterator end = std::remove_if(s.begin(),s.end(),predicate);
      s.erase(end, s.end());
}

现在删除r的演示:http://www.ideone.com/W5unx