std::deque<T,Allocator>::shrink_to_fit

来自cppreference.com
< cpp‎ | container‎ | deque
 
 
 
 
void shrink_to_fit();
(C++26 起为 constexpr)

请求移除未使用的容量。

它是减少使用内存而不更改序列的大小非强制性请求。请求是否达成依赖于实现。

指代元素的所有迭代器(包括 end() 迭代器)和所有引用均会失效。

如果 T可移动插入(MoveInsertable) std::deque<T, Allocator> 中,那么行为未定义。

(C++11 起)

目录

[编辑]复杂度

至多与容器大小成线性。

异常

如果不可复制插入(CopyInsertable) T 的移动构造函数以外的操作抛出异常,那么没有效果。

(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. 已添加

[编辑]参阅

返回元素数
(公开成员函数)[编辑]
close