需要对此进行解释,此行中实际发生了什么?

Fai*_*sal 3 c++ vector

我正在将一些C ++代码转换为python。但是我不确定这行到底是做什么的。

vector<double>().swap(prev);
Run Code Online (Sandbox Code Playgroud)

我编译了一个简单的程序以查看其实际作用,发现它会将向量“ prev”的大小调整为0。

#include <vector>
#include <iostream>
using namespace std;
int main(){
vector<int> ax;
ax.reserve(10);          
for(int i=99; i<110; ++i){
    ax.push_back(i);
}
for(int i=0; i<ax.size(); ++i){
  std::cout << ax[i] << ' ';

}

vector<int>().swap(ax);
cout<<"\nAfter space \n";
cout<<"size is "<<ax.size();

for(int i=0; i<ax.size(); ++i){
  std::cout << ax[i];

}
}
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 7

这是程序员出于某种原因决定的结果,

vector<int>().swap(ax);
Run Code Online (Sandbox Code Playgroud)

比...清楚

ax.clear();
Run Code Online (Sandbox Code Playgroud)

(前者交换最初是空的匿名临时vector<int>()使用ax)。


也许有点不合时宜,该swap方法可能会重置向量的容量,而clear()永远不会重置。但这仍然是一个奇怪的选择:如果您想重置容量,请使用

ax.clear();
ax.shrink_to_fit();
Run Code Online (Sandbox Code Playgroud)

但是即使那样也不能保证重置容量;由实施决定。

  • “某些原因”可能是在某些(大多数?)实现中,“ swap”版本还会重置容量,而“ clear”则不会重置容量。 (5认同)
  • 在C ++ 17之前,“交换版本”和“ ax = std :: vector &lt;int&gt;()”都不能保证重置容量,因为没有什么可以阻止默认构造函数将容量设置为零。从C ++ 17开始,默认构造函数将容量保留为零的可能性更大,因为该构造函数为`noexcept`,这很难保证向量分配的非零容量。这就是为什么C ++ 11引入了一个`shrink_to_fit()`成员函数来请求将容量减小到一定大小的原因。但是,痛苦的是,实现是否由`shrink_to_fit()`实际改变容量来定义。 (3认同)