Еще важный момент. vector::clear не удаляет элементы вектора. Capacity остается не тронутой. Поэтому даже если бы у вас в векторе хранились не указатели а std::string, которые бы сами удалили память в деструкторе, то память бы не освободилась в момент clear(). Это не была бы утечка, как таковая, потому что дальнейшая работа с вектором или удаляла элементы или переиспользовала бы их.
Если вам надо именно сейчас очистить память занятую веткором, то надо переприсвоить вектору пустой вектор: data = std::vector<Student>();
Ну или лучше воспользоваться swap: std::vector<Student>().swap(data);
Akina, Ранец как раз и взялся из ссылки. И прибыль - оттуда же. И я как раз и говорил, что к этому вопросу это все не применимо.
"на двумерный лист положить максимальное количество двумерных же деталей", вообще говоря - это задача упаковки, а не раскроя. Ну вот так у математиков получилось, что слово "раскрой" занято вот той задачей по ссылке, которая к вопросу отношения не имеет.
Akina, ну блин, задача раскроя, как и задача о ранце - целочисленное линейное программирование. Сформулируйте хоть одно целочисленное линейное уравнение тут.
То, что слово "раскрой" встречается и в вопросе и в названии задачи, не значит, что это та самая задача.
Выглядит, словно вы нагуглили и выдали первую попавшеюся ссылку даже не читая ее.
Artyom_Kopan, Почти. Домножать надо ужe uint. Тогда домножение на большое простое (или хотя бы нечетное) число в 64 бита и арифметика uint64_t по модулю 2^64 вносит элемент случайности.
И еще у вас у memcpy перепутан порядок аргументов.
Вместо сдвигов туда и обратно для младших битов можно использовать операцию побитового и с 0xFFFFFFFF или просто привести к int32_t - что отбросит лишние биты.
Или, можно вообще сразу написать return static_cast<uint32_t>((temp >> 32)^temp);. В младших битах как раз что вам надо получится и старшие выкинутся.
И старший/младший не переводится так на прямо на английский. Для этого там есть термины high/low.
Вам надо придумать еще парочку, для каждого варианта найти формулу, сколько шаблонов влезет по горизонтали и вертикали в зависимости от размеров листа (W, H) и трех размеров коробки (a, b, c)
Шаблон со сдвигом по диаганали, наверно, не самый эффективный, но это вам на подумать пример.
Например, для верхнего левого варианта влезает x=floor(W/(2a+2b) по горизонтали и y=floor((H-b)/(b+c)). Значит, всего в лист влезет x*y раскроев.
Еще возможны шаблоны, где используется не один вид развертки коробки, а несколько. Потом, еще могут быть всякие хитрые развертки, когда размеры коробки частично совпадают (например, 2 числа одинаковые, а третье больше или меньше). В этом случае могут быть возможны еще варианты расположений коробок. Еще отдельный случай - кубы. Когда у коробок все размеры одинаковые, ими можно замостить плоскость.
Потом вам надо в программе перебрать 6 перестановок всех длин коробки, 2 перестановки размеров листа, подставить во все формулы для разных паттернов и выбрать максимум.
Если коробок влезает мало, то возможно сделать полный перебор, который пытается впихнуть одну из возможных разверток на лист, касаясь уже поставленных там разверток и краев коробки (перебираете все возможные точки касания потом смотрите чтобы нигде ни с чем ничто не пересекалось). Но это может сможет расположить три вместо двух разверток. Если их хотя бы десяток влезает простым шаблоном, то полный перебор будет работать вечность и максимум впихнут 2-3 лишние коробки.
Lynn «Кофеман», Это уже сверху навешивается, когда имея набор шаблонов и их цены, надо выбрать, что же вырезать, чтобы побольше прибыли получить. Тут же более геометрическая задача - распихать в прямоугольнике как можно болше разверток одинаковых коробок.
ashot_powershot, C++ не умеет выводить массивы. Вам придется выводить по одному числу. Можно не выводить текст и вместо перевода строки выводить пробел. Тогда массив будет напечатан на одной строке.
Игорь Чувилин, Нет, не надо с С начинать. Вам надо пройти ознакомительный курс ассемблера. Писать на нем настоящие программы, конечно, не надо. Но после каких-то простеньких упражнений вы поймете как компьютеры устроены, что за стек, куча, как память организована.
Игорь Чувилин, В принципе, да. Естественно, в момент объявления массива его длина должна быть известна. А дальше, выделение массива на стеке - всего лишь сдвиг регистра, указывающего на верхушку стека. Но там куча деталей, как адресовать остальные локальные переменные, как выкинуть из стека все локальные переменные включая массивы и т.д. Обычно, все локальные переменные выделяются в самом начале функции и их смещения во фрейме стека известны во время компиляции.
alexhuuu, Это называется VLA.
Это не стандарт C, а лишь расширение. Не все компиляторы это поддерживают и это может усложнить генерируемый код. Лучше так не делать.
Игорь Чувилин, Вообще в C++ случайное невозможное изменение какой-то переменной - это почти всегда проблема работы с памятью. Или выход за границы массива, или use-after-free.