Контейнер для представления нескольких блоков памяти как одного непрерывного - PullRequest
6 голосов
/ 19 марта 2012

Есть ли какой-нибудь "стандартный" контейнер (STL, boost), который может представлять несколько блоков памяти как один непрерывный? Мне нужно работать с некоторыми данными при следующих условиях:

  • Общий объем данных заранее неизвестен (веб-ответ)
  • Память выделяется порциями (с некоторой внешней функцией выделения, которой я не могу управлять)
  • Освобождение памяти не контролируется мной, поэтому перераспределения относительно дороги

Итак, после получения всех данных у меня есть список блоков памяти. И мне нужно применить некоторые алгоритмы STL (поиск, копирование и т. Д.) К данным в целом. Есть решение написать контейнер для хранения информации об этих чанках + итератор пересылки, который может «перепрыгивать» из одного чанка в другой.

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

Ответы [ 3 ]

4 голосов
/ 19 марта 2012

Память вам предоставлена, говорите вы.Похоже, вы не хотите копировать это.Нет проблем, философия STL довольно гибкая.Вам на самом деле не нужен контейнер;они просто предназначены для управления памятью, и об этом уже позаботились.

Что вам нужно do , так это итератор.Там нет стандартного;вам придется написать один самостоятельно.Слишком много небольших вариаций, чтобы обеспечить стандартное решение для этого.Но не волнуйтесь, это довольно легко.Вы получите необходимые typedefs, если наследуете от std::iterator<value_type>, поэтому вам нужно только написать operator* (просто) и operator++ / operator-- / operator+ / operator- (которые понимают куски).

0 голосов
/ 19 марта 2012

Итак, после получения всех данных у меня есть список блоков памяти.И мне нужно применить некоторые алгоритмы STL (поиск, копирование и т. Д.) К данным в целом.Есть решение написать контейнер для хранения информации об этих чанках + итератор пересылки, который может «перепрыгивать» из одного чанка в другой.

Похоже, вам нужен итератор, который пересекает все ваши чаныбесшовно.std::deque<> предоставляет аналогичный итератор, поскольку он также выделяет память порциями.

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

0 голосов
/ 19 марта 2012

Мне нужно что-то подобное, и после осмотра я написал свой собственный, основанный на перегрузке оператора []. Соответствующие вопросы и ответы см. В следующих темах:

Могу ли я использовать оператор [] в C ++ для создания виртуальных массивов

Хороший класс массива C ++ для быстрого и эффективного использования больших массивов данных?

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