c – container.clear()是否释放/重新分配内部缓冲区?

前端之家收集整理的这篇文章主要介绍了c – container.clear()是否释放/重新分配内部缓冲区?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果我有一个容器并调用clear(),它是否只是破坏内部的所有元素,还是内部释放/分配新的内存呢?这种行为是否超出了C标准的范围?

这归结为:

unordered_set<int> mySet { 1,2,3,4,5 };
mySet.reserve(1000);
mySet.clear();

//Is this pointless/redundant
//or should I treat my container like it was just constructed?
mySet.reserve(1000);

对ideone(http://ideone.com/XQi8IT)的快速测试表明,在调用清除后,内部缓冲区被保留.所以,至少对于新版本的g在unordered_set是这种情况.我的问题是1)什么标准说,如果有什么和2)这个行为是否一致的所有容器.

解决方法

记忆中发生的事情是不明确的.它只是定义了以下要求:

对于顺序容器,我们对clear()有以下要求:

[C 11§23.2.3]表100

Destroys all elements in a. Invalidates all references,pointers,
and iterators referring to the elements of a and may invalidate the
past-the-end iterator.

post: a.empty() returns true

哪个没有提到任何记忆.对于关联容器,我们对clear()有这个要求:

[C 11§23.2.4]表102

a.erase(a.begin(),a.end())

这导致擦除(…)要求是:

erases the element pointed to by q. Returns an iterator pointing to the element immediately following q prior to the element being erased. If no such element exists,returns a.end()

哪个再次提到容器的内存缓冲区的容量.然后我们有无序的相关容器,具有类似的措词:

[C 11§23.2.5]表103

Erases all elements in the container. Post: a.empty() returns true

总体而言,标准没有提及内部存储缓冲区清除后发生的任何事情.所以这是不同的实现中不同的行为.

由于在所有容器中都没有保留(这会改变容量),而且下一个最好的东西(shrink_to_fit)也不是一个很好的方式来一直清除容器的内部存储器.

猜你在找的C&C++相关文章