交换技巧,stl

时间:2018-06-25 10:43:08

标签: c++ vector stl swap c++98

考虑到我们有一个std::vector,并且要编写它,使其大小==容量。

  vector<int> V;
  for(int i=0; i<10; ++i)
  {
        V.push_back(i);
  }
  std::cout<<V.size()<<" "<<V.capacity()<<endl;

因此,此输出为 10 13 (通过定义实现,我使用VS2017)。

如何以大小==容量的方式重新分配向量?

2 个答案:

答案 0 :(得分:4)

自C ++ 11起,shrink_to_fit()有一个std::vector方法。我建议使用而不是交换技巧。不过请注意,shrink_to_fit()是一个要求 图书馆的实施可能无法兑现。

  

将Capacity()减小为size()是非绑定请求。这取决于   关于执行是否满足请求的说明。

有关更多详细信息,请参见https://en.cppreference.com/w/cpp/container/vector/shrink_to_fit

答案 1 :(得分:1)

这是Scott Meyers的有效STL书中描述的一个技巧。
该技巧称为“缩小适应”,或者称为作者交换技巧

 std::vector<int>(V).swap(V);

这个想法很简单,我们创建一个V的临时副本,其大小为== capacity,然后用实际的V对其进行拍打。这很简单。

  vector<int> V;
  for(int i=0; i<10; ++i)
  {
        V.push_back(i);
  }
  std::cout<<V.size()<<" "<<V.capacity()<<endl;

  std::vector<int>(V).swap(V);

  std::cout<<V.size()<<" "<<V.capacity()<<endl;

现在此代码的输出为:
10 13
10 10

  

注意:此技巧也适用于std::string and std::deque