gpt4 book ai didi

c++ - 循环中的 Stroustrup 和溢出 size_type

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:18:12 27 4
gpt4 key购买 nike

我正在阅读 Bjarne Stroustrup 的“使用 C++ 的编程原则和实践”,我需要对我在第 25.5.3 节中发现的令人惊讶的部分进行澄清。作者声称如果我们想遍历 std::vector , 然后使用像

这样的循环变量
for (vector<int>::size_type i = 0; i < v.size(); ++i)

不如对 vector 使用迭代器安全类:

for (vector<int>::iterator p = v.begin(); p != v.end(); ++p)

因为,作为无符号类型,i可能会溢出。他指出使用迭代器的循环没有这样的限制。我有点困惑,因为我了解到 size_type保证足够大以表示可能的最大 vector ,因此 size_type 类型的变量永远不会在这样的循环中溢出。

编辑

更具体地说,他展示了一个使用 int 类型的循环变量的示例在其他两个之前,然后在最后他说:

size_type 保证是无符号的,因此第一个(无符号整数)形式比上面的 int 版本多了一位。这可能很重要,但它仍然只给出一位范围(将可以完成的迭代次数加倍)。使用迭代器的循环没有这样的限制。”

不是 vector<T>::size()返回 vector<T>::size_type ?我看不到任何限制。

最佳答案

嗯,是的,您引用的段落似乎间接暗示或暗示 size_type 可能有问题。但我不认为这是作者的意图。

注意前一段说(re: Second Edition)

So, technically, most of the loops in this book have been sloppy [...]. To avoid this problem we can use the size_type provided by vector, iterators, or a range-for-statement:

在这一段 size_type 中,为本书前面部分中使用的可能有问题的 int 循环提供了一个解决方案。它被称为与循环的迭代器或 range-for 版本一起的安全替代方案。


当有人尝试使用 std::size_t 来计算或索引非基于数组的容器的元素时,确实存在潜在的溢出(或范围不足)问题,例如 std: :liststd::dequestd::map 等,而不是使用容器自己的 size_type。但这是一个略有不同的故事,即使它是相关的。

关于c++ - 循环中的 Stroustrup 和溢出 size_type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42656436/

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