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> // 最小的带有调试输出的 C++11 分配器。 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 << "分配 " << n << " 个字节\n"; return static_cast<Tp*>(::operator new(n)); } void deallocate(Tp* p, std::size_t n) { std::cout << "解分配 " << n*sizeof*p << " 个字节\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 没有(像 std::vector 的)capacity() 函数 // 正因如此,我们使用自定义的分配器来展示 shrink_to_fit 的工作。 std::cout << "默认构造的 deque:\n"; std::deque<int, NAlloc<int>> deq; std::cout << "\n添加 300 个元素:\n"; for (int i = 1000; i < 1300; ++i) deq.push_back(i); std::cout << "\n弹出 100 个元素:\n"; for (int i = 0; i < 100; ++i) deq.pop_front(); std::cout << "\n运行 shrink_to_fit:\n"; deq.shrink_to_fit(); std::cout << "\ndeque 随离开作用域而销毁:\n"; }
可能的输出:
默认构造的 deque: 分配 64 个字节 分配 512 个字节 添加 300 个元素: 分配 512 个字节 分配 512 个字节 弹出 100 个元素: 运行 shrink_to_fit: 分配 64 个字节 分配 512 个字节 分配 512 个字节 解分配 512 个字节 解分配 512 个字节 解分配 512 个字节 解分配 64 个字节 deque 随离开作用域而销毁: 解分配 512 个字节 解分配 512 个字节 解分配 64 个字节
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 850 | C++98 | std::deque 缺少显式的移除未使用的容量的操作
|
已提供 |
LWG 2033 | C++11 | 1. T 不需要可移动插入 (MoveInsertable) 2. 缺失了复杂度要求 |
1. 需要 2. 已添加 |
参阅
返回元素数 (公开成员函数) |