векторпротив векторав с ++ - PullRequest
4 голосов
/ 18 января 2011

Очевидно, что это будет зависеть от используемого вами компилятора, но мне любопытно, что касается проблем производительности при выполнении vector<vector<largeObject>> против vector<vector<largeObject>*>, особенно в c ++.В частности:

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

Спасибо

Ответы [ 4 ]

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

Мой первый вопрос: «Почему вы используете вложенные векторы?»Если вам не нужно, чтобы размеры «2D-массива» были зазубренными, вы можете использовать один вектор и каноническую 2D-индексацию в 1D-массив (x + width * y).

Тем не менее, поскольку вектор копирует T экземпляров вокруг при изменении размера, и так далее, вектор указателей на большие объекты, вероятно, будет дешевле, поскольку копии будут меньше (копирование указателя по сравнению с «большим объектом»),Недостатком является то, что вам придется управлять распределением больших объектов самостоятельно, но может помочь что-то вроде boost_ shared_ptr (или стандартной версии, если у вас есть поддержка 0x - не auto_ptr, хотя)«Большой объект» здесь может быть любым, включая вложенные векторы или указатели на вектор, как в исходном примере, если это необходимо.

РЕДАКТИРОВАТЬ: Вы также можете использовать reserve () для предварительного выделения пространства в векторепредотвращая большое количество копий, если вы можете дать гарантии о количестве материала, который вы собираетесь вставить в вектор.

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

Вектор внутренне является указателем, поэтому указатель вектора является своего рода излишним.

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

В C ++ 03 этоможет быть дорого вставить больше векторов или (стереть существующие) вашего мастер-вектора, но C ++ 0x решает даже эту проблему с его семантикой перемещения.

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

0 голосов
/ 18 января 2011

Ответ с вопросами о производительности всегда: тест производительности или профиль его.

Также рассмотрите альтернативы:

vector< vector< LargeObject* > >, 

или

vector< vector< shared_ptr<LargeObject> > >

Что работает лучше всегобудет зависеть от выполняемых вами операций:

  • Множество конструкций / разрушений
  • Копии - можно ли их оптимизировать для использования vector :: swap ()?
  • DoВы удаляете элементы из середины вектора?

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

Чтобы защитить себя от необходимости слишком большого изменения кода в целях повышения производительности, вы можете / должны инкапсулировать 2D-массив в класс.

0 голосов
/ 18 января 2011

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

Иногда лучше использовать vector<vector<BigObject*>>

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