В чем разница использования прямого и обратного итераторов в find_if - PullRequest
2 голосов
/ 14 апреля 2020

У меня есть две функции (пример из книги):

std::string trim_right(std::string s)
{
    s.erase(std::find_if(s.rbegin(), s.rend(), isalpha).base(),s.end() );

    return s;
} 
std::string trim_left(std::string s)
{
    s.erase(s.begin(),
        std::find_if(s.begin(), s.end(), isalpha));
    return s;
}

Почему в функции trim_right с обратными итераторами мне нужно использовать base(), но в trim_left с прямыми итераторами I не нужно?

1 Ответ

0 голосов
/ 14 апреля 2020

Обратные итераторы являются адаптерами на обычных итераторах. И erase перегрузки принимают только обычные, нереверсивные, iterator и const_iterator. reverse_it.base() выполняет развертывание адаптированного итератора внутри reverse_iterator. Таким образом, это способ получить iterator от reverse_iterator или const_iterator от const_reverse_iterator.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...