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

Why does a vector's capacity become equal to it's size after being passed to a function?

本文关键字:于它 函数 容量 向量 为什么      更新时间:2023-10-16

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

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

上述代码的第一个输出系列表明,vector的容量比通常预期的增加了;然而,第二个系列的输出表明,大小总是等于容量。我假设这意味着容量每次被推回一个。

我明白,通常情况下,最好只是通过引用传递(const或不是),但是有没有任何情况下,我需要传递一个向量的副本,并以某种方式操作它,而不影响我的原始数据?在这种情况下,如果每次使用push_back,它都必须重新定位向量,那么按值传递将是低效的。

之类的
v2.assign(v1.first(), v1.end());
func(v2);

可以工作,假设func()通过引用接受一个向量,但对我来说似乎很奇怪,如果没有最好的选择,我可以通过值将一个向量传递给一个函数。

在c++中,您可以根据具体情况选择通过值传递,通过引用传递,或者通过指针传递

将vector 通过value传递给函数。正在生成向量的副本。vector复制构造函数使新vector的容量与被复制vector的大小相同。

如果通过引用传递vector ,或者通过指针传递vector ,则不进行复制,则输出原vector的大小/容量:

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