- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我写了一些采用迭代器但必须以相反顺序进行比较的代码,
template<class ConstBiIter>
bool func(ConstBiIter seq_begin, ConstBiIter seq_end)
{
ConstBiIter last = std::prev(seq_end);
while (--last != std::prev(seq_begin)) // --> I need to compare the beginning data
{
......
}
return true;
}
在 VS2013 中,在 Debug 模式下运行时,--last != std::prev(seq_begin)
将导致调试器断言失败并显示错误消息
Expression:string iterator + offset out of range.
但在 Release 模式下运行并给出正确的结果是完全可以的,因为在 Release 模式下没有边界检查。
我的问题是:
使用安全吗std::prev(some_container.begin())
像some_container.rend()
一样的哨兵?
如何直接比较 reverse_iterator
用iterator
?如果我写代码: std::cout << (std::prev(some_container.begin())==some_container.rend()) << std::endl;
它不会编译,即使你reinterpret_cast
他们。
我很好奇 prev(some_container.begin())
等于 some_container.rend()
body 上?
最佳答案
不,尝试递减开始迭代器是不安全的。
std::reverse_iterator
(这是 std::rend
返回的内容)实际上在 begin 迭代器之前不包含迭代器。它将底层迭代器存储到它在概念上指向的下一个元素。因此,当反向迭代器是“结束后的一个”(即“开始前”)时,其基础迭代器(通过调用 base()
获得)是开始迭代器。
关于c++ - 使用 std::prev(vector.begin()) 或 std::next(vector.begin(), -1) 像 some_container.rend() 作为反向哨兵是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25263676/
假设我有一个其他容器类型的 vector 。在迭代 vector 时,我更改了容器的大小。鉴于 vector 试图在系统内存中保持连续,指针算法会在这样的循环中失败吗?例如, #include #i
我写了一些采用迭代器但必须以相反顺序进行比较的代码, template bool func(ConstBiIter seq_begin, ConstBiIter seq_end) { Cons
我是一名优秀的程序员,十分优秀!