gpt4 book ai didi

c++ - 为什么 `std::prev` 不会引发 `std::unordered_set` 迭代器的错误?

转载 作者:行者123 更新时间:2023-11-30 00:50:46 25 4
gpt4 key购买 nike

我的问题与下面链接的问题有关。 Bidirectional iterators in unordered_map?

因为我不知道std::unordered_set不支持双向迭代器,所以我碰巧写了一个类似的代码。

int main(){
unordered_set<int> y{4};
std::cout << *(std::prev(y.end())) << std::endl;
}

此程序已编译,但代码的最后一行使程序崩溃。对此感到困惑,我遇到了链接问题。但是,我仍然不明白为什么这个程序被编译而不是抛出错误消息,而链接代码(即 boost::unordered_set)中的代码无法编译。你能澄清一下吗?

仅供引用,我在 g++ 4.8.2/Windows 7/64 位环境中使用 Mingw64。

最佳答案

std::prev 仅为双向迭代器生成已定义的行为。


GNU ISO C++ 库(由 GCC 4.8.2 使用)使用 std::advance 来实现 std::prev,而 std::advance 本身是这样实现的:

  • 对于随机访问迭代器:

    __i += __n;
  • 对于双向迭代器:

    if (__n > 0)
    while (__n--)
    ++__i;
    else
    while (__n++)
    --__i;
  • 对于所有其他迭代器:

    while (__n--)
    ++__i;

因此您可以看到,对于 unordered_set 的迭代器,该函数实际上不使用 operator--,这会在您链接的其他问题中产生编译器错误。


您有责任确保传递给 std::prev 的迭代器是双向的。如果不是这种情况,C++ 标准不会为您提供任何保证。 GCC 选择默默地忽略它,但它也可能使您的程序崩溃。

关于c++ - 为什么 `std::prev` 不会引发 `std::unordered_set` 迭代器的错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23868378/

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