如果我有一个容器,并调用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);
Run Code Online (Sandbox Code Playgroud)
对ideone的快速测试(http://ideone.com/XQi8IT)显示在调用clear之后内部缓冲区被保留.所以,至少对于新版本的g ++ unordered_set来说就是这样.我的问题是1)标准说什么,如果有的话2)这种行为是否在所有容器中是一致的.
Rap*_*ptz 13
没有具体说明内存会发生什么.它只定义了以下要求:
对于序列容器,我们有以下要求clear():
[C++11 §23.2.3] 表100
销毁所有元素
a.使引用元素的所有引用,指针和迭代器a无效并且可能使过去的迭代器无效.发布:
a.empty()退货true
哪个没有真正提及内存.对于关联容器,我们有以下要求clear():
[C++11 §23.2.4] 表102
a.erase(a.begin(),a.end())
这导致以下erase(...)要求:
擦除指向的元素
q.返回一个迭代器,指向q在删除元素之前紧跟的元素.如果不存在此类元素,则返回a.end()
这再次没有提及容器的内存缓冲区的容量.然后我们有无序的关联容器,它们的措辞相似:
[C++11 §23.2.5] 表103
擦除容器中的所有元素.发布:
a.empty()退货true
总的来说,标准没有提到内部存储器缓冲区后发生的任何事情clear.因此,未指定的行为可能因不同的实现而异.
由于reserve并非在所有容器中都可用(它确实改变了容量)并且两者都不是下一个最好的东西(shrink_to_fit)似乎没有一个好的方法来一致地清除容器的内部存储器.