Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/136.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一个STL字符串类可以容纳多少个字符?_C++_String_Stl - Fatal编程技术网

C++ 一个STL字符串类可以容纳多少个字符?

C++ 一个STL字符串类可以容纳多少个字符?,c++,string,stl,C++,String,Stl,我需要处理一系列的角色。字符数最多可达1011个。 在通常的数组中,这是不可能的。我应该用什么? 我想使用get()函数来保存字符串。但是,这对于STL容器是可能的吗? 如果没有,那怎么办 例如: 输入: 阿米拉希德 输出:A.M.I.R.A.H.I.D 如果32位机器中的字符数减少到10^10,如何实现这一点 提前感谢。可以创建这么大的阵列。但不是在32位机器上。切换到STL可能没有帮助,而且是不必要的。您需要考虑这是多少内存,以及是否有机会这样做 1011大约是100千兆字节,这意味着您甚至

我需要处理一系列的角色。字符数最多可达1011个。 在通常的数组中,这是不可能的。我应该用什么? 我想使用get()函数来保存字符串。但是,这对于STL容器是可能的吗? 如果没有,那怎么办

例如: 输入: 阿米拉希德 输出:A.M.I.R.A.H.I.D

如果32位机器中的字符数减少到10^10,如何实现这一点


提前感谢。

可以创建这么大的阵列。但不是在32位机器上。切换到STL可能没有帮助,而且是不必要的。

您需要考虑这是多少内存,以及是否有机会这样做

1011大约是100千兆字节,这意味着您甚至需要一个64位系统(和编译器)来处理它

STL的字符串最多支持
max_size()
个字符,因此答案可能会随着实现而改变。

如果您的机器有1011==93GB的内存,那么它可能是一台64位机器,因此
string
可以工作。否则什么也帮不了你

已编辑问题的已编辑答案:在这种情况下,您实际上不需要将整个字符串存储在内存中。您只能将它的一小部分存储到内存中

只需读取输入中的每个字符,将其写入输出,然后在其后面写一个点。重复此操作,直到在输入上获得和EOF。为了提高性能,您可以读取和写入大块数据,但仍然可以放入内存


这样的算法称为在线算法。

字符串与数组有相同的问题:*它必须适合内存


10^11个字符将占用4GB以上的空间。在内存空间为4GB的32位机器上,很难将其放入内存中。您或者需要将数据分成更小的块,一次只加载一位数据,或者切换到64位,在这种情况下,数组和字符串都应该能够保存数据(虽然将其拆分为多个较小的字符串/数组可能仍然是可取的,但这大约是100GB的数据。没有一个普通的字符串类能够在主内存中容纳超过容量的数据。您可能想看看,这是一个STL实现,允许将部分数据存储在磁盘上。

要做的就是在某个海量文件中读取相同的数据,然后在每个字符之间插入句点,为什么要同时将整个数据读取到内存中呢?选择一些合理的缓冲区大小并分块执行。

SGI版本的STL有一个ROPE类(ROPE是一个大字符串,明白了)

我不确定它是否设计用于处理那么多数据,但您可以看看。

不是
max\u size()的值
定义或至少受标准限制?输入:AMIRAHID输出:A.M.I.R.A.H.I.D,如果字符数接近10^10,如何在32位机器中实现这一点?@Rahi:Read single character.Print character.Print dot.Repeat.@ereOn:From docs on
std::allocator
返回:A.max\u size()如果该表达式格式正确;否则,numeric_limits::max()。
。从字符串上的文档:
返回:调用分配可能成功的最大值N(N,0)。
对于一台价格合理的机器的RAM来说,这太多数据了(并且没有任何东西,甚至STL都不能将100个字符打包到一个字节中)。您不可能同时需要所有这些数据。请将其分成更小的块。“标准库”!=“STL”,并且
std::string
不是源于STL的std库的那部分。@sbi:Errr..不是吗?因为
std::string
肯定是一个STL容器。@Billy:STL接口是在STL被合并到std库时重新安装到更旧的
std::basic_string
上的。但它肯定不是STL的一部分原始STL。@Rahi:这是什么数据?你怎么能像那样把它从10^11个字符减少到10^10个字符?你没有读过你得到的答案吗?答案会告诉你,同样的问题也适用于10^10个字符。它仍然超出了你在32位机器上的内存容量。这是干什么用的?即使你抓拍你的快照再次使用手指神奇地减少数据量,使其符合要求,您所做的工作仍然会非常缓慢和低效。您要解决的问题是什么?不是主内存--虚拟内存也可以使用磁盘!严格来说,32位机器可以使用超过4GB的内存,但不是通过单个进程单个连续数组中的ss(例如,打开“物理地址扩展”的处理器)。4GB限制仅限于每个虚拟内存空间。@Billy:但字符串和数组都必须是连续的(一般来说,32位机器的定义是拥有32位内存空间。个别架构可能会有一些技巧来解决这一问题,但这并不等于说任意32位机器可以使用超过4GB的内存空间。)好吧,假设我们讨论的是虚拟内存系统,这一点也不过分具体。在任何情况下,我的观点不是单个系统上的单个字符串超过2GB是有意义的,只是该系统实际上可以寻址超过4GB的物理RAM,因为“32位”指的是一个进程的虚拟地址空间,如果有多个进程,它们实际上可以消耗4GB以上的物理内存。STD::String不是这样的正确类型。它可能在技术上工作,但它不是为这种用法而设计的,因此将非常高效。C++程序是为正确的类型选择。你的数据很抱歉-1@Martin:嗯,答案仍然是正确的。OP没有问处理这么多数据的合理方法是什么,只是问
std::string
@jalf:对不起,我的错误。总是假设pe