可以使用swap来清除std :: set为vector吗?

时间:2012-01-12 18:35:10

标签: c++

可以使用交换函数来释放内存,就像下面提到的向量一样吗?

     std::vector<int> v1;

     // somehow increase capacity

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

5 个答案:

答案 0 :(得分:3)

向量的

swap被定义为交换两个向量的内容和capacity

set在其公共接口中没有类似容量的东西,所以它没有被定义为交换容量,只是内容。没有特别的理由说明为什么集合实现应该超出它所需的范围。但如果确实如此,那么就没有标准的方法可以确保释放“备用”内存,因为它允许将备用内存留在swap上。

答案 1 :(得分:2)

我不确定我理解你的问题,但是你问是否有可能以同样的方式清空一套?

如果是,那么是的。 :)

答案 2 :(得分:2)

是的,这个技巧可以让你将矢量的容量缩小到零:

std::vector<int> intVec;
intVec.reserve(100);
std::vector<int>().swap(intVec);

确切的元素数

std::vector<int> intVec;    
intVec.reserve(100);
intVec.push_back(1);
std::cout << intVec.capacity() << std::endl;  // prints 100
std::vector<int>(intVec).swap(intVec);
std::cout << intVec.capacity() << std::endl;  // prints 1

了解更多相关信息: http://www.gotw.ca/gotw/054.htm

答案 3 :(得分:2)

使用向量这样做的理由是,如果你只是使用向量的clear()resize()方法,很可能你的大小将被逻辑修剪为0,但分配的内存将留在那里重复使用。

如果你想要的是它实际上删除多余的内存,那么你将交换空的向量,它从来没有首先分配它(虽然它可能会分配一些)。

如果set已经分配了一些“节点”并且决定保留它们以便重复使用,那么对set执行相同操作也可以工作,尽管set没有reserve()函数所以实际上它取决于实现者关于是释放内存还是保留内存的STL。

答案 4 :(得分:1)

交换技巧可能对set不太有用,因为set不太可能保持过剩的容量。

此外,C ++ 11将shrink_to_fit()成员添加到容器中,这可能很有用。所以,只要使用它,如果它不可用,那么不要担心它。