std::deque<T,Allocator>::shrink_to_fit
来自cppreference.com
void shrink_to_fit(); | (C++26 起为 constexpr) | |
请求移除未使用的容量。
它是减少使用内存而不更改序列的大小非强制性请求。请求是否达成依赖于实现。
指代元素的所有迭代器(包括 end()
迭代器)和所有引用均会失效。
如果 | (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";returnstatic_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>&){returntrue;}template<class T, class U>bool operator!=(const NAlloc<T>&, const NAlloc<U>&){returnfalse;} 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++98 C++11 | 1. 缺失了复杂度要求(C++98) 2. T 不需要可移动插入(MoveInsertable) (C++11) | 1. 已添加 2. 需要 |
LWG 2223 | C++98 C++11 | 1. 引用、指针和迭代器不会失效(C++98) 2. 没有异常安全保证(C++11) | 1. 可能会失效 2. 已添加 |
[编辑]参阅
返回元素数 (公开成员函数) |