我目前正在学习C ++,在使用时遇到问题
std::string::reverse_iterator
反转字符串。尝试运行以下功能时,出现讨厌的编译器错误。但是,当我切换到使用时,
std::string::const_reverse_iterator
,代码即可编译并成功运行。为什么会这样,特别是在该语言的文档中说可以声明和使用反向迭代器时?如果我需要说,在反向循环遍历字符串时从字符串中删除元素,并想使用反向迭代器怎么办?一种
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> >&’
您有一个const std::string
,这意味着您只能对此做些const
事情。有两个重载std::string::rbegin()
:
reverse_iterator rbegin();
const_reverse_iterator rbegin() const;
第一个对您不可用,但是第二个对您不可用。
std::string reverse(const std::string &str)
{
std::string result;
for (auto r_iter = str.rbegin(); r_iter != str.rend(); r_iter++) {
result += *r_iter;
}
return result;
}
请注意,您甚至不需要循环,因为您可以std::string
从一对迭代器构造a ,请参见重载(6)
std::string reverse(const std::string &str)
{
return /* std::string */ { str.rbegin(), str.rend() };
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句