虽然我愿意解析字符串中包含的指令,但我基本上是想从它的空格和制表符字符中清除一个字符串,以便在其中查找指令。 不幸的是,我的循环进入了一个无限循环,我无法找到原因,因为我在每次删除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);
}
答案 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());
}
仅移除a
:http://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