Если у меня что-то вроде:
vector<int> longVector = { ... };
vector<int> newVector;
transform(longVector.begin(), longVector.end(), back_inserter(newVector),
[] (int i) { return i * i; });
Сможет ли STL предварительно выделить пространство в newVector
перед обработкой и добавлением новых элементов?Я знаю, что это не требование алгоритма, но сможет ли «хорошая» реализация оптимизировать это?Или, для такого случая, я бы предпочел добавить newVector.reserve(longVector.size());
раньше?Я не обязательно спрашиваю, имеет ли каждая реализация stdlib или нет (хотя, если кто-то знает конкретные примеры, которые были бы хорошими), но больше, если это вообще возможно (и ожидается), учитывая интерфейс и требования алгоритмов.
Этот вопрос касается нескольких алгоритмов STL, transform
, copy
, move
, fill_n
, ... И не только к back_inserter
, но также front_inserter
и inserter
Iпредположим.
РЕДАКТИРОВАТЬ: Для ясности я имею в виду, может ли stdlib обеспечить конкретные реализации, например, transform
, для случая, когда выходной итератор является back_inserter
из vector
, в этом случае он получит доступ к векторному объекту и зарезервирует достаточно места для хранения distance
между данной парой итераторов до фактического запуска преобразования.