std::deque<T,Allocator>::shrink_to_fit
来自 cppreference.com
void shrink_to_fit(); |
||
请求移除未使用的容量。
这是一个非约束性请求,旨在减少内存使用量,而不改变序列的大小。 是否满足请求取决于实现。
所有迭代器(包括 end()
迭代器)和所有对元素的引用都将失效。
内容 |
[编辑] 参数
(无)
类型要求 | ||
-T 必须满足 MoveInsertable 到 *this 的要求。 (自 C++11 起) |
[编辑] 返回值
(无)
[编辑] 复杂度
最多为容器大小的线性时间。
异常如果抛出除非 CopyInsertable |
(自 C++11 起) |
[编辑] 备注
在 libstdc++ 中,shrink_to_fit()
在 C++98 模式下 不可用。
[编辑] 示例
运行此代码
#include <cstddef> #include <deque> #include <iostream> #include <new> // Minimal C++11 allocator with debug output. template<class Tp> struct NAlloc { typedef Tp value_type; NAlloc() = default; template<class T> NAlloc(const NAlloc<T>&) {} Tp* allocate(std::size_t n) { n *= sizeof(Tp); std::cout << "allocating " << n << " bytes\n"; return static_cast<Tp*>(::operator new(n)); } void deallocate(Tp* p, std::size_t n) { std::cout << "deallocating " << n*sizeof*p << " bytes\n"; ::operator delete(p); } }; template<class T, class U> bool operator==(const NAlloc<T>&, const NAlloc<U>&) { return true; } template<class T, class U> bool operator!=(const NAlloc<T>&, const NAlloc<U>&) { return false; } int main() { // std::queue has no capacity() function (like std::vector). // Because of this, we use a custom allocator to show the // working of shrink_to_fit. std::cout << "Default-construct deque:\n"; std::deque<int, NAlloc<int>> deq; std::cout << "\nAdd 300 elements:\n"; for (int i = 1000; i < 1300; ++i) deq.push_back(i); std::cout << "\nPop 100 elements:\n"; for (int i = 0; i < 100; ++i) deq.pop_front(); std::cout << "\nRun shrink_to_fit:\n"; deq.shrink_to_fit(); std::cout << "\nDestroy deque as it goes out of scope:\n"; }
可能的输出
Default-construct deque: allocating 64 bytes allocating 512 bytes Add 300 elements: allocating 512 bytes allocating 512 bytes Pop 100 elements: Run shrink_to_fit: allocating 64 bytes allocating 512 bytes allocating 512 bytes deallocating 512 bytes deallocating 512 bytes deallocating 512 bytes deallocating 64 bytes Destroy deque as it goes out of scope: deallocating 512 bytes deallocating 512 bytes deallocating 64 bytes
[编辑] 缺陷报告
以下行为变更缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 850 | C++98 | std::deque 缺少显式的缩容操作 |
提供 |
LWG 2033 | C++11 | 1. T 不需要是 MoveInsertable2. 缺少复杂度要求 |
1. 需要 2. 添加 |
[编辑] 另请参阅
返回元素的数量 (公有成员函数) |