使用reverse_iterator而不是const_reverse_iterator并得到讨厌的编译器警告和错误

GUCCI MANE

我目前正在学习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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何检查将const_reverse_iterator分配给reverse_iterator无效?

STL reverse_iterator错误

变量中的reverse_iterator和迭代器抽象

reverse_iterator vs迭代器的性能?

为什么 std::reverse_iterator 比直接迭代器慢?

使用reverse_iterator反转数组(向量)

将reverse_iterator与类型擦除一起使用

为什么const_iterator不提供类似reverse_iterator的基础?

有没有更好的方法来使用 iterator 和 reverse_iterator 打印矢量元素?

reverse_iterator的歧义!=运算符

C ++ rbegin修改reverse_iterator的地址

倒数第二个的模板;reverse_iterator无法编译

自定义双向迭代器的reverse_iterator上的for_each需要OutputIterator

擦除和push_back發生時如何正確擦除reverse_iterator?

std::reverse_iterator 是否适用于适应范围?

为什么reverse_iterator具有默认构造函数?

operator []编译器错误和警告

为什么我不能将 operator+ 与 reverse_iterator 一起使用?

错误:“ make_reverse_iterator”不是“ std”的成员

使用const布尔值时的编译器警告

std::reverse_iterator 在开始之前如何保存一个?

为什么未指定std :: reverse_iterator :: operator []的返回类型?

为什么reverse_iterator会双重定义其嵌套类型?

C ++ 20对reverse_iterator的哪些更改破坏了此代码?

我对带有reverse_iterator的'push_back()'有疑问

奇怪的编译器警告未使用的变量,这是编译器错误吗?

为什么编译器会给出错误而不是警告已分配但从未使用过其值的变量

错误的C#编译器警告?

CLion:启用编译器错误/警告