Вектор против установленной эффективности - PullRequest
0 голосов
/ 30 марта 2019

Я работаю с большим набором данных. Вставляя элементы один за другим в набор или вектор, у меня возникла следующая путаница (в C ++):

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

Какой из них будет более эффективным?

1 Ответ

0 голосов
/ 30 марта 2019

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

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

Или я должен вставлять элементы в набор один за другим (с момента вставки для набора быстрее, чем для вектора), а затем тот набор сразу вектор?

Если вам нужно, чтобы элементы были в определенном порядке, вам следует использовать set. Набор будет эффективно размещать элементы в «правильном» месте, предполагая, что ваши элементы относятся к типу, который set понимает (например, числовые типы или string), в противном случае вам может потребоваться написать собственную функцию сравнения. В качестве альтернативы, если у вас есть более сложные данные, но вы можете определить значение ключа для сортировки, вам может потребоваться посмотреть map вместо set. - После этого вы не можете инициализировать vector из set «сразу»; вам нужно будет перебрать set и добавить к vector.

Какой из них будет более эффективным?

Учитывая, что у вас есть большой объем данных в качестве входных данных и предполагая, что данные расположены в случайном порядке:

Если вам не важен порядок элементов, то вызов push_back для вектора, скорее всего, будет быстрее.

Если вы планируете вставлять элементы где-то посередине, то set, скорее всего, быстрее, возможно, даже если вам нужно перенести данные в vector на втором шаге.

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

Теперь, когда вы знаете ожидаемый результат, я предлагаю вам попробовать оба. Протестируйте и измерьте!

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