Бесконечный цикл со строковым итератором в C ++ - PullRequest
0 голосов
/ 18 февраля 2011

Хотя я и хочу анализировать инструкции, содержащиеся в строках, я в основном пытаюсь очистить строку от ее пробелов и символов табуляции, чтобы искать в ней инструкции. К сожалению, мой цикл входит в бесконечный цикл, и я не могу найти, почему, поскольку я обновляю итератор при каждом стирании символа ...

Любая помощь, пожалуйста?

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 ]

12 голосов
/ 18 февраля 2011

Поток вашего кода:

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, что должно иметь гораздо меньшую сложность.

2 голосов
/ 18 февраля 2011

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 Solution

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

...