Сообщение Re[21]: Собеседования в Яндекс++ от 24.05.2019 20:32
Изменено 25.05.2019 0:40 Erop
Re[21]: Собеседования в Яндекс++
Здравствуйте, chaotic-kotik, Вы писали:
CK>
Ну всяко бывает, но, по идее, раз у нас коллекция на миллион векторов, то мы её в цикле наверное заполняем. И всё равно аллокация нужна.
Альтернативное решение -- иметь используемый в цикле аккомулятор, и из него копировать во вставляемые вектора с нужным reserve
По идее число аллокаций уменьшится...
Но в любом случае, я бы спрашивал не "как очистить вектор", а "как уменьшить capacity вектора", а то торудно понять про что спрашивают
Только на мой взгляд это мелкие мелочи же всё. Ну просто STL довольно дебильная библиотека, где вместо того, что бы вызвать какой-нибудь set_capacity, надо страдать фигнёй. Если программист на С++ не понимает как работают такие контейнеры -- это странно. А если не знает всех этих stl-ных трюков, то это фигня на прочитать местный кодинг стайл или что-то вроде того...
Ну это если работадатель адекватный.
Обычно инженеры, особенно с 10+ лет опытом сложных проектов нужны не для того, что бы такого рода трюки лабать, а для чего-то другого...
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>
Ну всяко бывает, но, по идее, раз у нас коллекция на миллион векторов, то мы её в цикле наверное заполняем. И всё равно аллокация нужна.
Альтернативное решение -- иметь используемый в цикле аккомулятор, и из него копировать во вставляемые вектора с нужным reserve
По идее число аллокаций уменьшится...
Но в любом случае, я бы спрашивал не "как очистить вектор", а "как уменьшить capacity вектора", а то торудно понять про что спрашивают
Только на мой взгляд это мелкие мелочи же всё. Ну просто STL довольно долго был дебильной библиотекой, где вместо того, что бы вызвать какой-нибудь shrink_to_fit, надо страдать фигнёй. Если программист на С++ не понимает как работают такие контейнеры -- это странно. А если не знает всех этих stl-ных трюков, то это фигня на прочитать местный кодинг стайл или что-то вроде того...
Ну это если работадатель адекватный.
Обычно инженеры, особенно с 10+ лет опытом сложных проектов нужны не для того, что бы такого рода трюки лабать, а для чего-то другого...
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+ лет опытом сложных проектов нужны не для того, что бы такого рода трюки лабать, а для чего-то другого...