可以使用交换函数来释放内存,就像下面提到的向量一样吗?
std::vector<int> v1;
// somehow increase capacity
std::vector<int>().swap(v1);
答案 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()
成员添加到容器中,这可能很有用。所以,只要使用它,如果它不可用,那么不要担心它。