Как указано в заголовке, когда я передаю вектор другой функции, ее емкость становится равной ее размеру во время вызова функции.Почему емкость вектора становится равной его размеру после передачи функции?
void sizeCheck(std::vector<int> test)
{
std::cout << "Size: " << test.size() << std::endl;
std::cout << "Capacity: " << test.capacity() << std::endl;
std::cout << std::endl;
}
int main()
{
std::vector<int> test;
for(int i = 0; i < 10; ++i)
{
test.push_back(i);
std::cout << "Size : " << test.size() << std::endl;
std::cout << "Capacity: " << test.capacity() << std::endl;
std::cout << std::endl;
}
test.resize(0);
for(int i = 0; i < 10; ++i)
{
test.push_back(i);
sizeCheck(test);
}
}
Первая серия выходов, приведенная выше, показывает, что пропускная способность вектора увеличивается, как обычно можно ожидать; однако вторая серия выходов указывает, что размер всегда равен емкости. Я предполагаю, что это означает, что каждый раз каждый шаг отбрасывается.
Я понимаю, что лучше было бы просто пройти по ссылке (const или нет), но нет никаких обстоятельств, когда мне нужно было бы передать копию вектора и каким-то образом манипулировать им, не затрагивая мои исходные данные? В этом случае передача по значению будет неэффективной, если каждый раз, когда я использую push_back, он должен перемещать вектор.
Что-то вроде
v2.assign(v1.first(), v1.end());
func(v2);
будет работать, если FUNC() принимает вектор по ссылке, но мне кажется странным, что мне позволено передать вектор в функцию по значению, если равны нулю случаи, когда это лучший вариант.
* если есть нулевые случаи, когда это лучший вариант * - Рассмотрим это: ваша функция принимает вектор по ссылке const, но затем внутри этой функции вы делаете копию этого вектора, чтобы вы могли работать с временным копия. С появлением конструкторов перемещения вполне возможно, что передача вектора по значению быстрее, чем передача вектора по ссылке const и копирование его внутри функции. – PaulMcKenzie
'test' в' main' не совпадает с параметром 'test' с' sizeCheck'. Если вы передадите 'test' по ссылке, с' void sizeCheck (std :: vector & test) ', то они будут одинаковыми, и вы получите разные результаты. –
TonyK
Я бы сказал, что случай, когда вам приходится многократно передавать большие векторы по значению, а затем добавлять к ним больше элементов и, в конечном счете, отбрасывать изменения, не является обычным явлением. – Brian