Информация об изменениях

Сообщение Re[21]: Собеседования в Яндекс++ от 24.05.2019 20:32

Изменено 25.05.2019 0:40 Erop

Re[21]: Собеседования в Яндекс++
Здравствуйте, chaotic-kotik, Вы писали:

CK>
CK>if (vec.capacity() / vec.size() > 2) {
CK>  vector<int> tmp;
CK>  tmp.reserve(vec.size());
CK>  copy(begin(vec), end(vec), back_inserter(tmp));
CK>  swap(tmp, vec);
CK>}

CK>bigAssCollection[key] = move(vec);
CK>


Ну всяко бывает, но, по идее, раз у нас коллекция на миллион векторов, то мы её в цикле наверное заполняем. И всё равно аллокация нужна.

Альтернативное решение -- иметь используемый в цикле аккомулятор, и из него копировать во вставляемые вектора с нужным reserve
std::vector<T> acc
for( 1000000 раз ) {
    acc.clear()
    заполняем acc
    vector<T> tmp;
    tmp.reserve( acc.size() )
    bigCollection[key] =move( tmp )
}

По идее число аллокаций уменьшится...

Но в любом случае, я бы спрашивал не "как очистить вектор", а "как уменьшить capacity вектора", а то торудно понять про что спрашивают

Только на мой взгляд это мелкие мелочи же всё. Ну просто STL довольно дебильная библиотека, где вместо того, что бы вызвать какой-нибудь set_capacity, надо страдать фигнёй. Если программист на С++ не понимает как работают такие контейнеры -- это странно. А если не знает всех этих stl-ных трюков, то это фигня на прочитать местный кодинг стайл или что-то вроде того...
Ну это если работадатель адекватный.
Обычно инженеры, особенно с 10+ лет опытом сложных проектов нужны не для того, что бы такого рода трюки лабать, а для чего-то другого...
Re[21]: Собеседования в Яндекс++
Здравствуйте, chaotic-kotik, Вы писали:

CK>
CK>if (vec.capacity() / vec.size() > 2) {
CK>  vector<int> tmp;
CK>  tmp.reserve(vec.size());
CK>  copy(begin(vec), end(vec), back_inserter(tmp));
CK>  swap(tmp, vec);
CK>}

CK>bigAssCollection[key] = move(vec);
CK>


Ну всяко бывает, но, по идее, раз у нас коллекция на миллион векторов, то мы её в цикле наверное заполняем. И всё равно аллокация нужна.

Альтернативное решение -- иметь используемый в цикле аккомулятор, и из него копировать во вставляемые вектора с нужным reserve
std::vector<T> acc
for( 1000000 раз ) {
    acc.clear()
    заполняем acc
    vector<T> tmp;
    tmp.reserve( acc.size() )
    bigCollection[key] =move( tmp )
}

По идее число аллокаций уменьшится...

Но в любом случае, я бы спрашивал не "как очистить вектор", а "как уменьшить capacity вектора", а то торудно понять про что спрашивают

Только на мой взгляд это мелкие мелочи же всё. Ну просто STL довольно долго был дебильной библиотекой, где вместо того, что бы вызвать какой-нибудь shrink_to_fit, надо страдать фигнёй. Если программист на С++ не понимает как работают такие контейнеры -- это странно. А если не знает всех этих stl-ных трюков, то это фигня на прочитать местный кодинг стайл или что-то вроде того...
Ну это если работадатель адекватный.
Обычно инженеры, особенно с 10+ лет опытом сложных проектов нужны не для того, что бы такого рода трюки лабать, а для чего-то другого...