这归结为:
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 ofa
and may invalidate the
past-the-end iterator.post:
a.empty()
returnstrue
哪个没有提到任何记忆.对于关联容器,我们对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 followingq
prior to the element being erased. If no such element exists,returnsa.end()
哪个再次提到容器的内存缓冲区的容量.然后我们有无序的相关容器,具有类似的措词:
[C 11§23.2.5]表103
Erases all elements in the container. Post:
a.empty()
returnstrue
总体而言,标准没有提及内部存储缓冲区清除后发生的任何事情.所以这是不同的实现中不同的行为.
由于在所有容器中都没有保留(这会改变容量),而且下一个最好的东西(shrink_to_fit)也不是一个很好的方式来一直清除容器的内部存储器.