Как изменить размер контейнера STL в C ++ - PullRequest
0 голосов
/ 20 апреля 2010

У меня есть кусок критичного к производительности кода, написанный с указателями и динамической памятью. Я хотел бы переписать его с контейнерами STL, но я немного обеспокоен производительностью. Есть ли способ увеличить размер контейнера без инициализации данных?

Например, вместо того, чтобы делать

ptr = new BYTE[x];

Я хочу сделать что-то вроде

vec.insert(vec.begin(), x, 0);

Однако это инициализирует каждый байт до 0. Разве нет способа просто заставить вектор расти? Я знаю о Reserve (), но он просто выделяет память, он не меняет размер вектора и не позволяет мне получать к нему доступ, пока я не вставлю действительные данные.

Спасибо всем.

Ответы [ 3 ]

4 голосов
/ 20 апреля 2010

vector.resize (...) может помочь? Вы можете указать размер, до которого вы хотите изменить размер (будет больше или меньше), а также инициализировать, к чему вы хотите инициализировать новые элементы.

3 голосов
/ 20 апреля 2010

vec.resize( newsize ) определено так же, как

vec.insert( vec.end(), newsize - vec.size(), T() )

если newsize > vec.size()… но у компилятора могут возникнуть трудности с определением, насколько он растет, а не уменьшается, и насколько. Вы можете попробовать профилирование с обоими.

Если вы уверены, что для инициализации по умолчанию требуется время, явно исключите ее с помощью собственного конструктора. (Даже если неявный конструктор в порядке, хорошо показать намерение.)

struct BYTE {
    char v;
    BYTE() {} // no default initialization!
    BYTE( char x ) : v(x) {}
    operator char&() { return v; }
    operator char const&() const { return v; }
    char *operator&() { return &v; } // not sure about operator&...
    char const *operator&() const { return &v; } // probably good in this case
};
2 голосов
/ 20 апреля 2010

изменение размера ()

Он может или не может делать что-то отличное от вашей вставки (). Значения построены по умолчанию.

...