Я сейчас нахожусь в процессе изучения C ++ и столкнулся с проблемой при использовании
std::string::reverse_iterator
для обращения строки.Я получаю неприятные ошибки компилятора при попытке запустить функцию ниже.Однако, когда я переключаюсь на использование
std::string::const_reverse_iterator
, код компилируется и запускается успешно.Почему это так, особенно когда в документации по языку говорится, что обратные итераторы могут быть объявлены и использованы?Что делать, если мне нужно сказать, удалить элементы из строки, проходя по ней в обратном порядке, и хотите использовать обратный итератор?A
const_reverse_iterator
наверняка не хватит в этом случае.Любая помощь приветствуется.:)
std::string reverse(const std::string &str)
{
std::string::reverse_iterator r_iter;
std::string result;
for (r_iter = str.rbegin(); r_iter < str.rend(); r_iter++) {
result += (*r_iter);
}
return result;
}
Некоторые из этих ошибок:
/usr/include/c++/7/bits/stl_iterator.h: In instantiation of ‘std::reverse_iterator<_Iterator>::reverse_iterator(const std::reverse_iterator<_Iter>&) [with _Iter = __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >; _Iterator = __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >]’:
chap6.cpp:40:34: required from here
/usr/include/c++/7/bits/stl_iterator.h:148:22: error: no matching function for call to ‘__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >::__normal_iterator(std::reverse_iterator<__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> > >::iterator_type)’
: current(__x.base()) { }
и
/usr/include/c++/7/bits/stl_iterator.h:775:26: note: candidate expects 0 arguments, 1 provided
/usr/include/c++/7/bits/stl_iterator.h:760:11: note: candidate: constexpr __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >::__normal_iterator(const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >&)
class __normal_iterator
^~~~~~~~~~~~~~~~~
/usr/include/c++/7/bits/stl_iterator.h:760:11: note: no known conversion for argument 1 from ‘std::reverse_iterator<__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> > >::iterator_type {aka __gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >}’ to ‘const __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char> >&’