gpt4 book ai didi

c++ - 在 C++ 中从 container.end() 中减去是否安全?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:06:58 27 4
gpt4 key购买 nike

也就是说,假设 container 不是空的,我可以安全地这样做吗:

std::vector<int> container;
container.push_back( 0xFACE8D );
auto last = container.end() - 1;

还有这个:

编辑:将 -1 替换为 -- :

std::list<int> container;
container.insert( 0xFACE8D );
auto last = container.end();
--last;

然后再针对任意非空容器?

编辑:让我澄清一下这个问题。

有时完全合法的代码会出现错误。问题是:假设上面的代码可以编译,这样做安全吗?

对于普通的 C 风格数组来说应该是安全的,因为相应的迭代器只是指针。但是对于更复杂的容器来说安全吗?

假设一个人用这样的迭代器实现列表:

class MyListIterator {
MyListIterator *prev, *next;
MyListIterator * operator--() { return prev; }
...
};

class MyList {
MyListIterator *end() { return NULL; }
...
};

然后尝试递减 container::end(),尽管在​​句法上完全合法,但会导致段错误。

不过,我希望 STL 容器比这更智能。因此,关于上述 STL::list 代码行为的保证问题,如果有的话。

最佳答案

std::vector返回 random-access iterators ,所以是的,这对于 vector 是安全的.

std::list返回 bidirectional iterators .它们可以递增(++)和递减(--),但不允许任意算术(+-)或相对比较(><)。 list 不安全.

您可以使用 std::advance 在双向迭代器上前进或后退任意数量。在 C++11 中你可以使用 std::prev 代替 iter - 1 .

关于c++ - 在 C++ 中从 container.end() 中减去是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32898142/

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