如何在 C++ 中比较两个大向量的大小
Posted
技术标签:
【中文标题】如何在 C++ 中比较两个大向量的大小【英文标题】:How to compare two big vector's size in C++ 【发布时间】:2013-05-17 14:47:53 【问题描述】:我有两个向量a,b。我想比较一下它们的大小。我知道我可以使用 if (a.size() > b.size())。但我的问题是,对于 a 或/和 b,大小是否超出了 int 类型。例如,a.size()是99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999,等我怎样才能比较a和b的大小?对不起我的英语。
【问题讨论】:
vector
的大小虽然在技术上是无限的,但实际上受限于可用 RAM 的数量。
向量的大小不存储在 int 中,而是存储在 size_t 中,这是一种特殊的 int 类型。一个向量只能存储 size_t 元素的最大值,如果你达到这个最大值,你会遇到比比较向量大小更多的问题,它可能只受地址空间的限制,而不是它们 size_t 类型的限制,但我从来没有费心去看进入它。
您列出的值是10^134 - 1
(忽略“等”)。鉴于在可观测宇宙中估计有10^80
个原子,您似乎不太可能找到足够的存储空间来存储这样一个向量。
【参考方案1】:
向量(或任何对象)的大小不可能大于std::size_t
所表示的大小。根据定义,该类型可以存储程序可以创建的最大对象的大小。
由于std::size_t
是std::vector
(或任何其他标准库容器的)size()
函数返回的类型,因此比较它们是安全的。
在 cmets 中回复问题:
std::size_t
不是无限的(在有限的计算机中,什么都不是)。但它保证足够大以容纳任何可能的对象的大小。注意 ion 比数组更特殊也是一个对象。 std::size_t
也不受 RAM 的限制,更多的是受您正在构建的平台的限制。例子:
在普通的 32 位系统(例如 Win32)上,地址空间是 32 位的,最大的对象(理论上)可以占用 232 个字节,所以 std::size_t
长度至少为 32 位。
在普通的 64 位系统(例如 Win64)上,地址空间是 64 位的,最大的对象(理论上)可以占用 264 个字节,所以std::size_t
长度至少为 64 位。
在 x86 实模式下,地址空间是 20 位的,但任何对象都不能占用超过一个 segment。 由于段是 216 字节,当目标平台是 x86 实模式时,16 位对于std::size_t
来说已经足够了。
【讨论】:
你的意思是size_t是无限的,只有RAM可以限制vector的大小? @kaji331 我已经添加了对答案的回复。 谢谢。你的意思是 object 和 size_t 受平台限制,所以即使我有“无限”的 RAM,我也无法创建无限向量,那么 size_t 是否足以进行比较? @kaji331 是的,差不多就是这样。请注意,在当今的非嵌入式平台上,平台限制很可能是地址空间的大小,这是您可以拥有的“无限”RAM 数量的上限。以上是关于如何在 C++ 中比较两个大向量的大小的主要内容,如果未能解决你的问题,请参考以下文章