Почему емкость вектора становится равной его размеру после передачи в функцию?

Как указано в заголовке, когда я передаю вектор другой функции, его емкость становится равной его размеру во время вызова функции.

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);
}
}

Первая серия выходов приведенного выше кода показывает, что емкость вектора увеличивается, как обычно можно ожидать; однако вторая серия выводов указывает, что размер всегда равен емкости. Я предполагаю, что это означает, что емкость каждый раз уменьшается на единицу.

Я понимаю, что обычно было бы лучше просто передать по ссылке (постоянную или нет), но нет ли каких-либо обстоятельств, когда мне нужно было бы передать копию вектора и каким-то образом манипулировать ею, не затрагивая мои исходные данные? В этом случае передача по значению будет неэффективной, если каждый раз, когда я использую push_back, он должен перемещать вектор.

Что-то вроде

v2.assign(v1.first(), v1.end());
func(v2);

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

1

Решение

В C ++ у вас есть выбор передачи по значению, по ссылке, или же по указателю, в зависимости от ситуации.

Вы передаете свой вектор по значению в функцию. Копия вектора делается. Конструктор векторного копирования делает емкость нового вектора такой же, как размер вектора, из которого копируется.

Если вы передадите свой вектор по ссылке или же по указателю вместо этого копия не создается, вместо этого вы выводите размер / емкость исходного вектора:

void sizeCheck(std::vector<int> &test)
{
std::cout << "Size:     " << test.size() << std::endl;
std::cout << "Capacity: " << test.capacity() << std::endl;
std::cout << std::endl;
}

void sizeCheck(std::vector<int> *test)
{
std::cout << "Size:     " << test->size() << std::endl;
std::cout << "Capacity: " << test->capacity() << std::endl;
std::cout << std::endl;
}
4

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector