std::deque<T,Allocator>::shrink_to_fit
来自cppreference.com
| |
||
请求移除未使用的容量。
它是减少使用内存而不更改序列的大小非强制性请求。请求是否达成依赖于实现。
指代元素的所有迭代器(包括 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";
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++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. 已添加 |
参阅
| 返回元素数 (公开成员函数) |