c++ - 将 rend 迭代器转换为 end 迭代器

标签 c++

这不是如何将 reverse_iterator 转换为 iterator 的重复,因为我希望结果与正常转换不同。

只给定一个从 rend 返回的 reverse_iterator ,是否可以将其转换为相应的 iterator结束?

例如

std::vector<int> myvec = {...};
auto rit = myvec.rend();
auto it = MAGIC(rit);
it == myvec.end(); // true

如果仅给定 reverse_iterator 不可能做到这一点,那么做到这一点所需的最少信息是什么? (所以我可以考虑变通办法)。

最佳答案

简答:否。
迭代器指的是容器中的一个点,而不需要容器本身的实际知识。 end()rend() 返回的迭代器指向容器的不同端点,即它们指向的点之间可能有一些、很多或没有元素,不管其中一个迭代器的反向性质如何。因此,在不知道容器本身或至少不知道其大小的情况下,不可能从容器的一端到达另一端,并且由于迭代器不知道该知识,因此不可能从 rend()end(),从 end()begin() 等,无需额外信息。

最少需要的信息是两点之间“差距”的大小。有了它以及反向和非反向迭代器之间的正常转换,这是一个简单的任务:

auto rend = v.rend();
auto begin = rend.base();
assert(begin == v.begin());
auto end = begin + v.size();  //the size is the key!
assert(end == v.end());

但是,由于您无法从 reverse_iterator 中获取大小,而只能从容器本身获取大小,因此您可以轻松地首先向它请求 end()

关于c++ - 将 rend 迭代器转换为 end 迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26757121/

相关文章:

java - 使用 JNI 从 Java 到 native (C++) 代码使用 byte[]

c++ - std::lock_guard() 用于锁定的 std::mutex

c++ - 使用链接为静态的 boost::regex 编译我的项目

C++ 正则表达式从字符串中提取所有可能的 10 位数字

c++ - 在 Windows 中创建 C++ 非阻塞计时器

c++ - 如何在gdb中查看 map 的值?

c++ - 无法打印字符数组

c++ - 具有许多成员变量的类的最佳实践

c++ - 关于CUDA中的固定内存,它有上限吗?

c++ - 在 OpenGL 中将窗口坐标转换为轴坐标