我正在使用一些Qt容器,比如QList
和QVector
,我注意到访问数据的索引是用int
定义的,而不是size_t
。我一直在STL、Boost和其他容器中看到size_t
,所以我想知道为什么Qt不使用它。这些容器是否存在负数的含义?
我正在使用一些Qt容器,比如QList
和QVector
,我注意到访问数据的索引是用int
定义的,而不是size_t
。我一直在STL、Boost和其他容器中看到size_t
,所以我想知道为什么Qt不使用它。这些容器是否存在负数的含义?
这是一个任意的选择。当用于访问元素时,负数不是有效的索引。有时,当用于直接元素访问以外的方法时,它们可能具有特殊含义。
通常情况下,你只能访问20亿个元素而不是40亿个元素并不重要。如果你需要处理如此多的元素,那么你应该使用其他容器。
int
只保证至少为 16k,而不是 20 亿。此外,在大多数当前的台式电脑上,size_t
不限于 40 亿 - 即使手机也开始进入 64 位时代! - danielschemmelint
保证是什么,因为Qt支持有限数量的平台,而且没有一个平台有16位的整数。这是一个已经完成的交易,没有任何“如果”或“但是”的问题。此外,Qt
在任何具有16位整数的设备上都无法正常工作。最多只能勉强运行,并且会出现许多损坏的功能。我试过一次,结果很糟糕。我不得不使用grep将int
替换为int32_t
才能使其正常工作。再次说明,从实际角度来看,Qt(和C++)的集合对于如此大的项目计数没有太大意义,因此int
是完全足够的。 - Kuba hasn't forgotten Monicaunsigned
是否为有效索引很容易(i < size()
vs i >=0 && i < size()
)。此外,在逻辑上正确的情况下使用unsigned
而使用int
通常会隐藏微妙的错误,因为存在从有符号到无符号的隐式转换(除非您在应用程序中始终使用signed int
)。我不同意“Qt(和C++)集合在具有如此大的项目计数时没有太多意义”,我可以看到一个4Gb的QByteArray
的用例(不使用QByteArray
是因为很难防止COW,但它与STL容器一起正常工作)。 - sbabbi