2015-10-07 3 views
1

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

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() принимает вектор по ссылке, но мне кажется странным, что мне позволено передать вектор в функцию по значению, если равны нулю случаи, когда это лучший вариант.

+0

* если есть нулевые случаи, когда это лучший вариант * - Рассмотрим это: ваша функция принимает вектор по ссылке const, но затем внутри этой функции вы делаете копию этого вектора, чтобы вы могли работать с временным копия. С появлением конструкторов перемещения вполне возможно, что передача вектора по значению быстрее, чем передача вектора по ссылке const и копирование его внутри функции. – PaulMcKenzie

+0

'test' в' main' не совпадает с параметром 'test' с' sizeCheck'. Если вы передадите 'test' по ссылке, с' void sizeCheck (std :: vector & test) ', то они будут одинаковыми, и вы получите разные результаты. – TonyK

+1

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

ответ

4

В 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; 
} 
+0

@Remy - Спасибо за редактирование! –

Смежные вопросы