如何在 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_tstd::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++ 中比较两个大向量的大小的主要内容,如果未能解决你的问题,请参考以下文章

如何调整 2D C++ 向量的大小?

在 C++ 中对向量进行分组排序

如何在 C++ 的主函数中为全局声明的 2d 向量分配大小?

如何获取 C++ 类成员向量的大小?

请问C++中两个字符串的大小是怎样比较的?

按块比较两个向量时如何避免重复