gpt4 book ai didi

c++ - 反转 reverse_iterator 应该给出原始类型的正向迭代器吗?

转载 作者:行者123 更新时间:2023-11-30 01:36:19 27 4
gpt4 key购买 nike

我天真地期望这个程序能够编译并运行成功:

#include <iterator>
#include <string>

int main()
{
const std::string s = "foo";
auto forward_iter = s.begin();
auto reverse_iter = std::make_reverse_iterator(forward_iter);
auto third_iter = std::make_reverse_iterator(reverse_iter);
return forward_iter != third_iter;
}

编译失败,因为third_iter的类型与 forward_iter 的不一样我们开始于;相反,它是 reverse_iterator<reverse_iterator<normal_iterator>> :

0.cpp:10:25: error: no match for ‘operator!=’ (operand types are ‘__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> >’ and ‘std::reverse_iterator<std::reverse_iterator<__gnu_cxx::__normal_iterator<const char*, std::__cxx11::basic_string<char> > > >’)
return forward_iter != third_iter;
~~~~~~~~~~~~~^~~~~~~~~~~~~

重新阅读文档,似乎 std::make_reverse_iterator(it)指定为始终换行 it , 即使 it已经是一个反向迭代器(在某种程度上这是有道理的,因为我们期望使用 reverse_iterator 成员(即 base() )。

是否有一种标准方法可以在不知道我拥有哪种类型的情况下,在正常(正向)和包装(反向)迭代器之间进行交换?或者我是否需要编写一对 SFINAE 函数来返回 std::make_reverse_iterator(it)it.base()合适吗?

最佳答案

Should reversing a reverse_iterator give a forward iterator of the original type?

没有。或者至少,这不是make_reverse_iterator 的方式。已指定。返回类型指定为 reverse_iterator<Iterator>在标准中。

Is there a standard way to swap between normal (forward) and wrapped (reverse) iterators, without knowing which type I have?

没有。据我所知不是。

Or do I need to write a SFINAE pair of functions to return std::make_reverse_iterator(it) and it.base() appropriately?

你可以写。我不能说你是否需要它。

这是一种实现方式:

#include <iterator>
#include <type_traits>

// https://stackoverflow.com/a/35408829/2079303
template<typename I>
struct is_reverse_iterator : std::false_type {};

template<typename I>
struct is_reverse_iterator<std::reverse_iterator<I>>
: std::integral_constant<bool, !is_reverse_iterator<I>::value> {};

template<class It>
auto
reverse_or_base(It&& i)
{
if constexpr (is_reverse_iterator<std::decay_t<It>>())
return i.base();
else
return std::make_reverse_iterator(std::forward<It>(i));
}

还有一个测试:

#include <vector>
#include <cassert>
int main() {
std::vector<int> v;
static_assert(
std::is_same_v<
decltype(reverse_or_base(v.rbegin())),
std::vector<int>::iterator
>
);
assert(v.end() == reverse_or_base(v.rbegin()));

static_assert(
std::is_same_v<
decltype(reverse_or_base(v.begin())),
std::vector<int>::reverse_iterator
>
);
assert(v.rend() == reverse_or_base(v.begin()));
}

关于c++ - 反转 reverse_iterator 应该给出原始类型的正向迭代器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52429377/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com