clear()
仅仅将容器中的元素释放(析构)掉,会导致size = 0,但是容器容量capacity不会变,即占用内存没有变化。
int main()
{
std::vector<int> vec;
std::cout<<vec.size()<<std::endl;
std::cout<<vec.capacity()<<std::endl;
for(int i= 0;i < 10;++i)
{
vec.push_back(i);
}
std::cout<<vec.size()<<std::endl;
std::cout<<vec.capacity()<<std::endl;
vec.clear();
std::cout<<vec.size()<<std::endl;
std::cout<<vec.capacity()<<std::endl;
return 0;
}
swap()
我们知道,vector底层是动态开辟的数组,要想将容量缩小,那是不可能的。
swap()是将容器底层的动态数组指针进行交换,然后把各自的size以及capacity的值进行交换。
还有一个技巧,利用swap()进行容器的缩容,某些情况下,考虑到性能或者其他情况我们需要将容器进行缩容:
int main()
{
std::vector<int> vec;
std::cout<<vec.size()<<std::endl;
std::cout<<vec.capacity()<<std::endl;
for(int i= 0;i < 10;++i)
{
vec.push_back(i);
}
{
std::vector<int> tmp;
tmp.swap(vec);
std::cout<<tmp.size()<<std::endl;
std::cout<<tmp.capacity()<<std::endl;
}
std::cout<<vec.size()<<std::endl;
std::cout<<vec.capacity()<<std::endl;
return 0;
}
将我们需要缩容的容器与一个没有元素的临时容器进行交换,最终使得我们需要缩容的容器的size和capacity的大小一样,达到了缩容的目的,临时对象出作用域被析构,对象中的资源被释放。
shrink_to_fit() c++11提供:将容器的容量capacity设置为容器中元素的size
收缩到合适的容量。
int main()
{
std::vector<int> vec;
std::cout<<vec.size()<<std::endl;
std::cout<<vec.capacity()<<std::endl;
for(int i= 0;i < 10;++i)
{
vec.push_back(i);
}
std::cout<<vec.size()<<std::endl;
std::cout<<vec.capacity()<<std::endl;
vec.shrink_to_fit();
std::cout<<vec.size()<<std::endl;
std::cout<<vec.capacity()<<std::endl;
return 0;
}
输出:
0
0
10
16
10
10