gpt4 book ai didi

c++ - 使用 std::prev(vector.begin()) 或 std::next(vector.begin(), -1) 像 some_container.rend() 作为反向哨兵是否安全?

转载 作者:可可西里 更新时间:2023-11-01 18:20:04 26 4
gpt4 key购买 nike

我写了一些采用迭代器但必须以相反顺序进行比较的代码,

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 模式下没有边界检查。

我的问题是:

  1. 使用安全吗std::prev(some_container.begin())some_container.rend()一样的哨兵?

  2. 如何直接比较 reverse_iteratoriterator ?如果我写代码: 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/

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