2012-06-02 2 views
4

Читая std::vector ссылки я понял, чтоКонтроля над стандом :: вектор перераспределением

  1. вызова insert при достижении максимальной емкости приведет к перераспределению в std::vector (вызывая итератор недействительности), потому что новая память выделенных для него с большей пропускной способностью. Цель состоит в том, чтобы сохранить гарантию на непрерывные данные.

  2. До тех пор, пока я придерживаюсь максимальной емкости insert, это не вызовет (и итераторы будут неповреждены).

Мой вопрос заключается в следующем:

Когда reserve вызывается автоматически insert, есть ли способ, чтобы контролировать, сколько новая память должна быть зарезервирована?

Предположим, что у меня есть вектор с начальной емкостью 100 и, когда максимальная емкость ударяется, я хочу выделить дополнительные 20 байтов.

Возможно ли это?

ответ

5

Вы всегда можете отследить его самостоятельно и зарезервировать вызов до его выделения, например.

static const int N = 20 // Amount to grow by 
if (vec.capacity() == vec.size()) { 
    vec.reserve(vec.size() + N); 
} 
vec.insert(...); 

Вы можете обернуть это в функции самостоятельно и вызвать эту функцию вместо вызова insert() непосредственно.

+0

Я не понимаю, как это разумно. Вызов 'reserve()' перераспределит все элементы, а затем вы получите другой набор копий при вызове 'insert()'. Кроме того, 'reserve()' гарантирован только для того, чтобы зарезервировать * как минимум * запрошенный размер и может фактически зарезервировать больше. – jrok

+0

Вопрос в том, как я могу его контролировать. Это самый контроль, который вы можете получить, и даже если он выделяет больше, вы никогда не получаете распределения, которые не попадают в этот оператор if, даже если они могут быть больше, чем вы просили. – Flexo

+0

Моя точка зрения, почему бы не позволить 'insert()' выполнять свою работу? – jrok