я пытался реализации метода C++, которая удаляет начальные и конечные пробелыЧто происходит с итераторами, если вы удаляете() элемент в C++?
string::iterator begin = s.begin();
string::iterator end = s.end()-1;
while (*begin == ' ') {
cout << "*begin is: " << *begin << endl;
begin++;
}
while (*end == ' ') {
cout << "*end is: " << *end << endl;
end--;
}
s.erase(s.begin(),begin);
s.erase(end+1,s.end());
Тогда мой код Разбился. После нескольких отладок я обнаружил, что на самом деле это вызвало мое «неправильное расположение итератора» (я сделал это имя ... не знаю, что именно эта ошибка называется ...), когда я erase()
элементов из строки. Так что, если я делаю это вместо того, чтобы (изменить процедуру):
string::iterator begin = s.begin();
while (*begin == ' ') {
cout << "*begin is: " << *begin << endl;
begin++;
}
s.erase(s.begin(),begin);
string::iterator end = s.end()-1;
while (*end == ' ') {
cout << "*end is: " << *end << endl;
end--;
}
s.erase(end+1,s.end());
нет больше проблем: D
Так что я действительно хотел бы знать, что именно происходит с итератора, когда вы erase()
элемент из него. Например, если вы erase()
первые/последние два элемента, что произойдет с s.end()
/s.begin()
?
Я считаю, что термин, который вы ищете, является недействительным итератором. – DeiDei
Когда вы удаляете все существующие итераторы, они недействительны, точно так же, как в описании стирания. Поэтому, чтобы вы могли стереть с начала и конца, вам нужно разделить его на два прохода, где вы сначала удаляете начальные пробелы, а затем получаете новые итераторы для стирания конечных. –
Instrad с использованием ручных циклов, посмотрите на ['find_first_not_of()'] (http://en.cppreference.com/w/cpp/string/basic_string/find_first_not_of) и ['find_last_not_of()'] (http://en.cppreference.com/w/cpp/string/basic_string/find_last_not_of). –