【问题标题】:The swap trick, stl交换技巧,stl
【发布时间】:2018-06-25 10:43:08
【问题描述】:

考虑我们有一个 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)。

如何重新分配vector的方式,其中size == capacity?

【问题讨论】:

  • 无法保证您可以缩小矢量。任何依赖这种“技巧”的东西都可能无法在某些平台上运行

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


【解决方案1】:

自 C++11 以来,std::vector 有一个 shrink_to_fit() 方法。我建议使用它而不是交换技巧。但是请注意,shrink_to_fit() 是一个请求 库实现可能不会兑现。

将容量()减少到大小()是一个非绑定请求。这取决于 关于请求是否满足的实现。

更多详情请见https://en.cppreference.com/w/cpp/container/vector/shrink_to_fit

【讨论】:

  • 感谢您的回答,但我在这里谈论的是 C++98 :)
【解决方案2】:

这是 Scott Meyers 的 Effective STL 书中描述的一个技巧。
该技巧称为缩小以适应,或者作者如何称呼它,交换技巧

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

这个想法很简单,我们为它创建一个大小==容量的 V 的临时副本,然后用实际的 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

【讨论】:

  • 从 c++11 开始就有一个shrink_to_fit 方法。无需任何技巧。
  • 这本书是为 C++98 标准编写的,但无论如何感谢@interjay
  • 虽然它是一种常见的实现方法,但我不相信标准保证向量的复制构造函数会产生 size == capacity。
  • @interjay shrink_to_fit 不保证容量减少。
  • @Yiğit 是的,但是在使用交换技巧时,实现也可以保留比需要更多的内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 2019-01-21
  • 2011-06-05
  • 2010-11-25
  • 2011-08-30
  • 1970-01-01
相关资源
最近更新 更多