Сколько символов может содержать класс строки STL? - PullRequest
5 голосов
/ 03 декабря 2010

Мне нужно работать с серией символов.Количество символов может быть до 10 11 .В обычном массиве это невозможно.Что я должен использовать?Я хотел использовать функцию gets () для хранения строки.Но возможно ли это для контейнеров STL?Если нет, то какой путь?

Пример: input: AMIRAHID output: AMIRAHID

Как сделать это возможным, если количество символов уменьшилось до 10 ^ 10 на 32-битном компьютере?1007 *

Заранее спасибо.

Ответы [ 7 ]

6 голосов
/ 03 декабря 2010

Ну, это примерно 100 Гбайт данных. Ни один обычный строковый класс не сможет вместить больше, чем умещается в вашей основной памяти. Возможно, вы захотите взглянуть на STXXL , который является реализацией STL, позволяющей хранить часть данных на диске.

2 голосов
/ 03 декабря 2010

Если ваша машина имеет 10 11 == 93 ГБ памяти, то, вероятно, это 64-битная машина, поэтому string будет работать. В противном случае вам ничего не поможет.

Отредактированный ответ на отредактированный вопрос: В этом случае вам не нужно хранить всю строку в памяти. Вы можете хранить только небольшую часть, которая помещается в память.

Просто прочитайте каждый символ из ввода, запишите его в вывод и запишите точку после него. Повторите это, пока вы не получите и EOF на входе. Для повышения производительности вы можете читать и записывать большие порции данных, но такие, которые все еще могут уместиться в памяти.

Такие алгоритмы называются онлайн-алгоритмы .

2 голосов
/ 03 декабря 2010

Вам нужно подумать, сколько это памяти, и есть ли у вас шанс сделать это вообще.

10 11 - это примерно 100 гигабайт, что означает, что вам потребуется 64-битная система (и компилятор), чтобы даже иметь возможность обратиться к ней.

Строки STL поддерживают максимум max_size() символов, поэтому ответ может меняться в зависимости от реализации.

2 голосов
/ 03 декабря 2010

Это возможно для массива, который будет создан. Но не на 32-битной машине. Переход на STL, скорее всего, не поможет и не нужен.

1 голос
/ 03 декабря 2010

SGI-версия STL имеет класс ROPE (веревка - большая нить, поймите ее).

Я не уверен, что он предназначен для обработки такого большого количества данных, но вы можете посмотреть.
http://www.sgi.com/tech/stl/Rope.html

1 голос
/ 03 декабря 2010

Строка страдает той же проблемой, что и массив: * она должна уместиться в памяти .

10 ^ 11 символов занимает более 4 ГБ.Трудно вписаться в память на 32-разрядной машине с объемом памяти 4 ГБ.Вам нужно либо разбить ваши данные на более мелкие порции и загружать их только по частям за раз, либо переключиться на 64-битный режим. В этом случае и массивы и строки должны содержать данные.(хотя все же может быть предпочтительнее разбить его на несколько более мелких строк / массивов

0 голосов
/ 03 декабря 2010

Если все, что вы пытаетесь сделать, это прочитать в каком-то массивном файле и записать в другой файл те же самые данные с периодами, чередующимися между каждым символом, зачем беспокоиться о одновременном чтении всего этого в память? Выберите разумный размер буфера и сделайте это кусками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...