Re[21]: Собеседования в Яндекс++
От: Erop Россия  
Дата: 24.05.19 20:32
Оценка:
Здравствуйте, 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+ лет опытом сложных проектов нужны не для того, что бы такого рода трюки лабать, а для чего-то другого...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Отредактировано 25.05.2019 0:40 Erop . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.