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