Обрезка пробелов / преобразование итераторов - PullRequest
1 голос
/ 09 октября 2011

Я хотел написать две однострочные функции, которые будут обрезать пробелы слева и справа от строки. Левая сторона не была проблемой:

void trimLeft(string &s) {
  s.erase(s.begin(), find_if(s.begin(), s.end(), (int (*)(int))isgraph));
}

Но когда я попробовал нечто подобное для правой стороны:

void trimRight(string &s) {
  s.erase(find_if(s.rbegin(), s.rend(), (int (*)(int))isgraph), s.end());
}

У меня были некоторые ошибки компилятора. Проблема в том, что я должен преобразовать reverse_iterator (который возвращается find_if) в обычный итератор. Как это сделать?

Ответы [ 3 ]

2 голосов
/ 09 октября 2011

Вы можете использовать функцию-член base() для восстановления базового итератора из его reverse_iterator.

void trimRight(string &s) {
  s.erase(find_if(s.rbegin(), s.rend(), (int (*)(int))isgraph).base(), s.end());
}
1 голос
/ 09 октября 2011

Глядя на документацию, кажется, что string :: erase прекрасно работает с reverse_iterators. Проблема в том, что вы смешиваете итераторы в обратном и прямом направлениях. Так что попробуйте

void trimRight(string &s) {
  s.erase(s.rbegin(), find_if(s.rbegin(), s.rend(), (int (*)(int))isgraph));
}

Редактировать: Нет.

0 голосов
/ 10 октября 2011
...