2016-08-28 6 views
1

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

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

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

Хотя это может быть сделано в Rust с LinkedList от Vec, есть ли более идиоматический способ выполнения этой задачи?

ответ

3

На самом деле, я бы предпочел Vec<Vec<T>> в этой ситуации, которая похожа на то, как std::deque реализуется под обложками в C++.

С Vec<Vec<T>>, где все внутреннее Vec<T> имеют одинаковый максимальный размер, и все, кроме первого и последнего Vec<T> полны до краев, вы можете иметь O (1) индексацию и стабильность памяти.

Конечно, указатель на куски будет перемещаться, поскольку внешний Vec перераспределяет и все, но memcpy из 24 байтов достаточно прост.

+0

'(Vec > Vec )', вероятно, лучше, чем 'Vec >', так как мало смысла иметь емкость для всех внутренних распределений, и имеющий последний 'Vec' инлайн будет сделать быстрее PUSH/хлопков. Но это самое незначительное. – Veedrac

+0

@ Veedrac: большая разница между 'Vec ' и 'Box <[T]>' заключается в том, что в последнем вам нужно * точное число элементов, тогда как вы можете вырастить 'Vec ', как вам нужно, пока не получите его "max «количество элементов (но сначала резервируйте, чтобы избежать перераспределения). –

+0

Вот почему это '(Vec >, Vec )', а не только 'Vec >'. Вы не хотите изменять размер значений в середине, так как все они заполнены. – Veedrac

Смежные вопросы