Что-то вроде deque для большого количества предметов, но небольшое использование памяти для маленьких чисел? - PullRequest
0 голосов
/ 14 января 2011

У меня есть целая куча объектов определенного типа, каждый из которых может выделить deque для хранения других объектов того же типа. Я использую deque, потому что мне нужен быстрый доступ на обоих концах, и потому что любой конкретный объект может ссылаться на многие другие объекты.

Однако вполне вероятно, что многие или даже большинство объектов ссылаются на очень мало других объектов. В этом случае использование памяти deque довольно велико. Реализация, которую я использую, выделяет 4096 байт сразу, как только я делаю самый первый push_back (). Каждый элемент в деке занимает всего 8 байтов. Это много потраченного впустую пространства, особенно потому, что я делаю многие из этих объектов, и, следовательно, многие из этих заявок.

В то же время мне в значительной степени нужна дека (или что-то подобное), потому что, как я уже сказал, любой конкретный объект может фактически ссылаться на многие другие объекты, несмотря на то, что большинство объектов ссылаются на очень немного других объектов.

Моей первой мыслью было использование Capacity () и Reserve () для самостоятельного увеличения deque, но мой компилятор сообщил мне, что в deque таких функций нет.

Итак, я подумал, возможно, написать класс с интерфейсом в стиле deque, лежащим в основе вектора и deque, с вектором, используемым до (скажем) шестнадцати элементов, которые существуют, после чего вектор отбрасывается и с этого момента используется deque.

Поскольку вектор используется только при небольшом количестве элементов, на самом деле не должно иметь большого значения то, что push_front () и pop_front () будут неэффективными с точки зрения скорости, и так как я могу контролировать вектор с Capacity () и Reserve (), это не должно иметь большого значения, поскольку deque использует много памяти, когда существует больше элементов.

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

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

Ответы [ 2 ]

2 голосов
/ 14 января 2011

Вы можете использовать (навязчивый) список, если вам не нужен произвольный доступ по индексу.Списки позволяют быстро O (1) push_front/push_back() и pop_front/pop_back().

Если объекты не являются общими, то есть объект принадлежит только одному другому объекту, а навязчивый списокЛучший.А поскольку ваши объекты относятся к одному и тому же типу, они могут быть выделены из одного пула памяти (большого массива), чтобы избежать каких-либо накладных расходов памяти.

2 голосов
/ 14 января 2011

Вы не упоминаете, нужны ли вам другие возможности vector или deque, такие как итераторы с произвольным доступом.Если вы этого не сделаете, на самом деле это хороший кандидат для использования list.Имеет хорошую производительность при вставке и удалении с обоих концов.

...