为什么向量的容量在传递给函数后会变得与它的大小相等?

时间:2015-10-07 00:13:45

标签: c++ vector std

如标题所述,当我将向量传递给另一个函数时,其容量将等于函数调用时的大小。

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()通过引用获取一个向量,但是对我来说似乎很奇怪,如果有零情况,我可以通过值将向量传递给函数,这是最好的选择。

1 个答案:

答案 0 :(得分: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;
}