Изменение резервной памяти вектора C++

Я подозреваю, что ваша проблема связана с тем, что по умолчанию ковариаты сводятся к их среднему значению в emmeans . Вы можете использовать аргументы at или cov.reduce, чтобы указать большее количество значений. См. Документацию для ref_grid и vignette(“basics”, “emmeans”) или указатель тем виньетки.

5
задан Ashwin Nanjappa 4 April 2011 в 10:28
поделиться

5 ответов

vector<Item>(m_listItems).swap(m_listItems);

уменьшится m_listItems снова: http://www.gotw.ca/gotw/054.htm (Herb Sutter)

Если Вы хотите очистить его так или иначе, подкачайте с пустым вектором:

vector<Item>().swap(m_listItems);

который, конечно, является более эффективным путем. (Обратите внимание, что свопинг векторов basicially означает просто подкачивать два указателя. Ничто действительно трудоемкое продолжение)

20
ответ дан 18 December 2019 в 06:23
поделиться

Вы могли попробовать эту технику отсюда

std::vector< int > v;
// ... fill v with stuff...
std::vector< int >().swap( v );
1
ответ дан 18 December 2019 в 06:23
поделиться

Вы можете swap это с новым вектором, который требовал способности.

vector< int > tmp;
old.swap( tmp );
1
ответ дан 18 December 2019 в 06:23
поделиться

Насколько я могу сказать, Вы не можете перераспределить вектор к более низкой мощности, чем это когда-нибудь имеет; можно только выделить его больше. Существуют серьезные основания для этого; среди них то, что процесс перераспределения чрезвычайно в вычислительном отношении интенсивен. Если у Вас действительно должен быть меньший вектор, освободить старый и создать новый, это меньше. Это на самом деле в вычислительном отношении намного более просто, чем наличие вектора на самом деле изменяет размер меньший.

1
ответ дан 18 December 2019 в 06:23
поделиться

Можно подкачать вектор, поскольку другие предложили, и, как описано в http://www.gotw.ca/gotw/054.htm, но знают, что это не свободно, Вы выполняете копию каждого элемента, потому что вектор должен выделить новый, меньший, блок памяти, и копировать все старое содержание. (Операция подкачки является чрезвычайно бесплатной, но Вы подкачиваете с временным файлом, инициализированным с копией данных исходного вектора, которые не свободны),

Если Вы знаете заранее, насколько большой вектор, необходимо выделить правильный размер для начала, таким образом, никакое изменение размеров не необходимо:

std::vector<foo> v(1000); // Create a vector with capacity for 1000 elements

И если Вы не знаете способности заранее, почему имеет значение, тратит ли это впустую немного пространства? Это стоящий времени потратило копирование каждого элемента к новому и меньшему вектору (который является что станд.:: вектор (v) .swap (v) сделает), только для сохранения нескольких килобайтов памяти?

Точно так же при очистке вектора если Вы намереваетесь снова наполнить его так или иначе, обнуление его способности, кажется, впечатляющая пустая трата времени.

Править:

baash05: что, если у Вас было 1 000 000 объектов 10 megs поршня. Вы сказали бы, что сокращение суммы издержек важно?

Нет. Изменение размеров вектора требует большей памяти, временно, поэтому если Вы ограничены памятью, который мог бы повредить Ваше приложение. (У Вас должны быть исходный вектор в памяти и временный файл, прежде чем можно будет подкачать их, таким образом, Вы заканчиваете тем, что использовали вдвое больше RAM в той точке). Впоследствии, Вы могли бы сохранить небольшой объем памяти (до нескольких МБ), но это не имеет значения, потому что к избыточной мощности в векторе никогда не получали бы доступ, таким образом, это продвинуть к файлу подкачки, и таким образом, не рассчитывают к Вашему пределу RAM во-первых.

Если у Вас есть 1 000 000 объектов, то необходимо инициализировать вектор к корректному размеру во-первых.

И если Вы не можете сделать этого, затем Вы обычно будете более обеспеченным отъездом одной только способности. Тем более, что Вы заявили, что собираетесь снова наполнить вектор, необходимо определенно снова использовать способность, которая была уже выделена, вместо выделения, перераспределения, копирования и освобождения всего постоянно.

У Вас есть два возможных случая. Или Вы знаете, сколько элементов необходимо сохранить, или Вы не делаете. Если Вы знаете, то можно создать вектор с корректным размером во-первых, и таким образом, Вы никогда не должны изменять размер его, или Вы не знаете, и затем Вы могли бы также сохранить избыточную мощность, так по крайней мере, он не должен будет изменять размер вверх при пополнении вектора.

2
ответ дан 18 December 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: