Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用reverse_迭代器而不是const_reverse_迭代器,会得到令人讨厌的编译器警告和错误 我目前正在学习C++,在使用时遇到问题。 std::string::reverse_iterator_C++_C++11_Iterator_Stdstring_Reverse Iterator - Fatal编程技术网

使用reverse_迭代器而不是const_reverse_迭代器,会得到令人讨厌的编译器警告和错误 我目前正在学习C++,在使用时遇到问题。 std::string::reverse_iterator

使用reverse_迭代器而不是const_reverse_迭代器,会得到令人讨厌的编译器警告和错误 我目前正在学习C++,在使用时遇到问题。 std::string::reverse_iterator,c++,c++11,iterator,stdstring,reverse-iterator,C++,C++11,Iterator,Stdstring,Reverse Iterator,使字符串反向。我在尝试运行下面的函数时遇到了严重的编译器错误。但是,当我切换到使用时 std::string::const_reverse_iterator ,代码编译并成功运行。为什么会出现这种情况,尤其是当该语言的文档说明可以声明和使用反向迭代器时?如果我需要说,在反向循环字符串时从字符串中删除元素,并希望使用反向迭代器,该怎么办?A const_reverse_iterator 在这种情况下,这肯定是不够的。任何帮助都将不胜感激。:) std::string反向(const std::

使字符串反向。我在尝试运行下面的函数时遇到了严重的编译器错误。但是,当我切换到使用时

std::string::const_reverse_iterator
,代码编译并成功运行。为什么会出现这种情况,尤其是当该语言的文档说明可以声明和使用反向迭代器时?如果我需要说,在反向循环字符串时从字符串中删除元素,并希望使用反向迭代器,该怎么办?A

const_reverse_iterator
在这种情况下,这肯定是不够的。任何帮助都将不胜感激。:)

std::string反向(const std::string&str)
{
std::string::reverse_迭代器r_iter;
std::字符串结果;
对于(r_iter=str.rbegin();r_iter
其中一些错误是:

/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:在“std::reverse_iterator::reverse_iterator(const std::reverse_iterator&)”的实例化中[使用Iter=\uu gnu_cxx::\uu normal_iterator;\u iterator=\uu gnu cxx::\uu normal_iterator]:
第6章cpp:40:34:此处需要
/usr/include/c++/7/bits/stl_iterator.h:148:22:错误:调用“_gnu_cxx::_normal_iterator::_normal_iterator(std::reverse_iterator::iterator_type)”时没有匹配的函数
:当前(_ux.base()){}

/usr/include/c++/7/bits/stl_迭代器。h:775:26:注意:候选者需要0个参数,提供1个参数
/usr/include/c++/7/bits/stl_iterator.h:760:11:注:候选:constexpr\uuu gnu\ucxx:::\uuu normal\u iterator::\uu normal\u iterator(const\uu gnu\ucxx::\uu normal\u iterator&)
类uu正规迭代器
^~~~~~~~~~~~~~~~~
/usr/include/c++/7/bits/stl_iterator.h:760:11:注意:没有已知的参数1从'std::reverse_iterator::iterator_type{aka uuu gnu_cxx:::u normal_iterator}到'const u gnu cxx:'的转换

str
作为
const&
传递,因此无法从中删除元素,也无法获取非const迭代器,如果要修改它,需要删除const:

std::string reverse(std::string &str)
                //  ^---------------------- no const if you want to modify it !!!
{
    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;
}

但是,这可以在一个步骤中完成,而不是先复制然后反转,如所示。

将整个常量正确性问题放在一边。你表现出了一些单一的(对C++来说)代码编写习惯

首先,在需要之前不要定义
r\u iter
,而是将其限制在循环的范围内。除此之外,在这种情况下,您实际上并不关心迭代器的确切类型。您只需要从成员函数中获得正确的迭代器类型

因此,只需对迭代器的类型使用
auto

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反向(const std::string&str)
{
std::字符串结果;
对于(auto r_iter=str.rbegin();r_iter

现在,默认情况下,您的代码是常量正确的。如果您试图错误地修改输入字符串,希望错误会比无意中选择错误的迭代器类型时更清楚。

您有一个
const std::string
,这意味着您只能对它执行
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
,请参阅


请注意,函数的
str
是一个常量类型的参数。rbegin()应返回常量类型迭代器。这是合理的

rbegin()的声明如下:

      reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

因此,您可以从函数的参数列表中删除
const
关键字以使其运行,或通过反向迭代器修改
str

您可以引用编译器错误吗,不管你觉得这些错误有多严重?请在问题中添加错误,不是重复,而是同一个问题:错误包含在帖子中。不要被
\uu gnu\u cxx::\uu normal\u iterator
弄糊涂,这是一个你实际上不应该担心的实现细节(除非你收到一条严重错误消息;)。“正式”没有类
normal\u迭代器
D'Oh!非常感谢你!我的想法是我根本没有修改输入,所以我想节省将参数复制到参数中的开销。但是现在我知道,要获得一个参数的非常量迭代器,参数必须不是常量!谢谢:D@GUCCIMANE 如果您确实修改了字符串,这并不重要。您也不能执行
常量int x;int&y=x
即使在推动惯用时从未使用引用
y
来修改
x
,我想你也必须提到
std::reverse
,这将是反转字符串的惯用方法…@user463035818
std::reverse
已经就位。这将返回一个新的
std::string
@user463035818-有两个原因我没有返回。(1) 你已经做到了:)(2)有时重新发明一部分轮子来学习是有益的。@Caleth hm是的,你的回答我认为我们已经涵盖了所有的可能性;)@说书人谢谢!我将熟悉“自动”并开始更多地使用它。它似乎很强大,但我只是迈出了很小的一步,打字了很长一段路才把脚弄湿。标准库的重复主题。@Caleth哇,最后一部分的优雅解决方案!但是,您能否详细说明“{str.rbegin(),str.rend()}”的语法,以及为什么不需要为std::string(即返回std::string(str.rbegin(),str.rend())使用重载构造函数@GUCCIMANE
{}
是的语法之一。
std::string
是可选的,表达式
{str.rbegin(),str.rend()}
位于需要
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;
}
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 reverse(const std::string &str)
{
    return /* std::string */ { str.rbegin(), str.rend() };
}
      reverse_iterator rbegin();
const_reverse_iterator rbegin() const;