Как добавить элемент в начало вектора в C ++? [Дубликат]

В одной кавычки строка не содержит переменных внутри нее. Строка с двойными кавычками.

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

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

32
задан Sam 28 August 2014 в 11:50
поделиться

7 ответов

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

Использовать std :: deque для этого, для чего он предназначен.

36
ответ дан Mark Ransom 26 August 2018 в 21:17
поделиться

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

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

2
ответ дан Diego Sevilla 26 August 2018 в 21:17
поделиться

Старый поток, но он появился на столе сотрудника в качестве первого результата поиска для запроса Google.

Существует одна альтернатива использованию дека, который стоит рассмотреть:

std::vector<T> foo;
for (int i = 0; i < 100000; ++i)
  foo.push_back(T());
std::reverse( foo.begin(), foo.end() );

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

Как всегда, измерьте, прежде чем решать, что делать.

22
ответ дан Happy Green Kid Naps 26 August 2018 в 21:17
поделиться

Я думаю, вы должны изменить тип своего контейнера, если вы действительно хотите вставить данные в начале. Именно поэтому вектор не имеет функции-члена push_front ().

2
ответ дан Hongseok Yoon 26 August 2018 в 21:17
поделиться

Скорее всего, deque является подходящим решением, как это было предложено другими. Но только для полноты, предположим, что вам нужно сделать эту переднюю вставку только один раз, что в другом месте программы вам не нужно делать другие операции спереди, а в противном случае vector предоставляет необходимый вам интерфейс. Если все они верны, вы можете добавить элементы с очень эффективным push_back, а затем reverse вектором, чтобы все было в порядке. Это будет иметь линейную сложность, а не полиномиальную, как при вставлении спереди.

12
ответ дан Mark B 26 August 2018 в 21:17
поделиться

Если одна из критических потребностей вашей программы состоит в том, чтобы вставлять элементы в начале контейнера: тогда вы должны использовать std::deque, а не std::vector. std::vector хорош только при вставке элементов в конец.

STL diagram for choosing containers [/g0]

В C ++ 11 были введены другие контейнеры. Я должен начать поиск обновленного графика с этими новыми контейнерами и вставить его здесь.

98
ответ дан Stephane Rolland 26 August 2018 в 21:17
поделиться

Если вы ищете эффективный способ вычисления в фронте, вы, вероятно, захотите использовать deque вместо вектора.

11
ответ дан Tim Rupe 26 August 2018 в 21:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: