#c #visual-c
#c #visual-c
Вопрос:
Мне нужно вставить в конец вектора по 2 элемента каждый раз.
Мне было интересно, выполняется ли vector.insert(iter_first, iter_second) быстрее, чем выполнение vector.push_back (сначала), затем vector.push_back (второй)?
Возможно, другой альтернативой было бы создать структуру, подобную этой:
struct T{int a; int b;};
T t;
t.a = first;
t.b = second;
X.push_back(t);
Комментарии:
1. Ничего, что может повлиять на вас. Двигаемся дальше.
2. Вы не должны структурировать свои данные на основе того, что, по словам некоторых парней, может быть немного быстрее. Используйте то, что имеет смысл. Если эти два значения логически связаны друг с другом, скорее всего, это имеет смысл как структура, независимо от каких-либо потенциальных последствий для производительности.
3. Две
push_backs
, похоже, по крайней мере в два раза быстрее, чем одна вставка диапазона в конце. Понятия не имею, почему, вероятно, из-за затрат на настройку массива из двух целых чисел для вставки.4. @UncleBens — push_back добавляет постоянное количество элементов в известном месте. Оптимизировать это намного проще, чем вставлять неизвестную последовательность элементов в случайном положении (что insert должен уметь делать).
Ответ №1:
Если два элемента логически связаны, то вы бы использовали структуру или класс. Если они не связаны, то, конечно, не группируйте их по соображениям производительности.
Это пахнет преждевременной оптимизацией. Вместо этого напишите код, который наиболее понятен для поддержки, и позвольте компилятору сгенерировать код за вас. Для этого она и существует. Учтите, что код, который легко читается, прост в обслуживании, а код, который легко поддерживать, легко реорганизуется и с меньшей вероятностью будет иметь незначительные ошибки производительности из-за недопонимания.
Ответ №2:
Хотя в вашем случае разница незначительна, в целом стандарт языка C определяет информацию о сложности, поэтому вам не нужно спрашивать — вы можете просто посмотреть. vector::push_back
имеет постоянную временную сложность и vector::insert
либо пропорциональна сумме количества вставленных элементов и количеству перемещаемых элементов, либо произведению двух, в зависимости от того, как вы это вызываете.
Ответ №3:
Вставка в конце вектора будет намного быстрее, чем вставка в середине или начале вектора.
Это будет иметь значение только тогда, когда у вас большой вектор и / или конструкторы копирования ваших объектов невероятно болезненны.
Ответ №4:
Практически говоря, push_back
вызовет insert
, так что вызов push_back
дважды заканчивается вызовом insert
дважды. Однако на практике, если код был оптимизирован, я был бы удивлен, если бы это имело значение. Делайте то, что логично, и оптимизируйте позже, если у вас возникнут проблемы с производительностью.