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

来自cppreference.com
< cpp‎ | container‎ | deque

 
 
 
 
void shrink_to_fit();

请求移除未使用的容量。

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

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

参数

(无)

类型要求
-
T 必须符合可移动插入 (MoveInsertable) *this 中的要求。(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";
        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. 已添加

参阅

返回元素数
(公开成员函数)