【问题标题】:QVector, QList etc.. why index is int and not size_t [duplicate]QVector、QList 等。为什么索引是 int 而不是 size_t [重复]
【发布时间】:2015-07-22 21:03:49
【问题描述】:

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

【问题讨论】:

  • 我相信重复问题的答案充其量是有问题的......另一个问题中来自顺磁羊角面包的评论可能是一个更好的答案。这是 qt 中许多令人讨厌的糟糕设计决策之一。为了记录,尽量不要学习 Qt 并正确使用有符号和无符号。

标签: c++ qt indexing


【解决方案1】:

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

通常,您只能访问 20 亿个项目而不是 40 亿个项目并不重要。如果您的物品数量接近这个数量,那么无论如何您都应该为您的容器使用其他东西。

【讨论】:

  • int 只保证至少 16k,而不是 20 亿。除此之外,size_t 在当前大多数台式电脑上不限于 40 亿——甚至手机也开始进入 64 位时代!
  • @gha.st:我不认为 Qt 是在任何使用 16 位 int 的平台上构建的。
  • 不仅仅是 2^32 对 2^31。检查unsigned 是否是有效索引很容易(i < size()i >=0 && i < size())。此外,使用int,其中unsigned 是逻辑上正确的选择,通常会隐藏细微的错误,因为有符号到无符号的隐式转换(除非您在应用程序中的任何地方都使用signed int)。我不同意 Qt's (and C++'s) collections make little sense with such large item counts,,我可以看到 4Gb QByteArray 的用例(不会使用 QByteArray,因为它很难防止 COW,但它适用于 STL 容器)。
  • 我在以前的项目中使用过显着超过 4 GB 的 STL 容器——它们工作得很好。并解释说多平台工具包的一个糟糕的设计选择并不是多平台真的很有趣;D
  • @gha.st:为什么 Qt 不针对无法合理支持其功能的平台很有趣?这似乎完全是浪费时间和精力。
猜你喜欢
  • 1970-01-01
  • 2011-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
  • 2010-09-05
相关资源
最近更新 更多