QVector、QList等为什么索引是int而不是size_t?

3

我正在使用一些Qt容器,比如QListQVector,我注意到访问数据的索引是用int定义的,而不是size_t。我一直在STL、Boost和其他容器中看到size_t,所以我想知道为什么Qt不使用它。这些容器是否存在负数的含义?


1
我认为复制的问题的答案充其量是有问题的......另一个问题中The Paramagnetic Croissant的评论可能是更好的答案。这是Qt中许多恼人的糟糕设计决策之一。为了记录,请尝试不要从Qt中学习,确保正确使用有符号和无符号。 - sbabbi
1个回答

1

这是一个任意的选择。当用于访问元素时,负数不是有效的索引。有时,当用于直接元素访问以外的方法时,它们可能具有特殊含义。

通常情况下,你只能访问20亿个元素而不是40亿个元素并不重要。如果你需要处理如此多的元素,那么你应该使用其他容器。


1
int 只保证至少为 16k,而不是 20 亿。此外,在大多数当前的台式电脑上,size_t 不限于 40 亿 - 即使手机也开始进入 64 位时代! - danielschemmel
@gha.st 不管int保证是什么,因为Qt支持有限数量的平台,而且没有一个平台有16位的整数。这是一个已经完成的交易,没有任何“如果”或“但是”的问题。此外,Qt在任何具有16位整数的设备上都无法正常工作。最多只能勉强运行,并且会出现许多损坏的功能。我试过一次,结果很糟糕。我不得不使用grep将int替换为int32_t才能使其正常工作。再次说明,从实际角度来看,Qt(和C++)的集合对于如此大的项目计数没有太大意义,因此int是完全足够的。 - Kuba hasn't forgotten Monica
1
这不仅仅是关于2^32与2^31的问题。检查unsigned是否为有效索引很容易(i < size() vs i >=0 && i < size())。此外,在逻辑上正确的情况下使用unsigned而使用int通常会隐藏微妙的错误,因为存在从有符号到无符号的隐式转换(除非您在应用程序中始终使用signed int)。我不同意“Qt(和C++)集合在具有如此大的项目计数时没有太多意义”,我可以看到一个4Gb的QByteArray的用例(不使用QByteArray是因为很难防止COW,但它与STL容器一起正常工作)。 - sbabbi
1
我之前的项目中使用了超过4GB的STL容器,它们运行得非常好。而通过说它不是那么跨平台来解释一个糟糕的设计选择,真的很有趣;D - danielschemmel
1
@gha.st:为什么Qt不针对那些无法合理支持其功能的平台,这很有趣吗?这似乎是完全浪费时间和精力。 - Michael Burr
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接