std::vector<T,Allocator>::shrink_to_fit
From cppreference.com
void shrink_to_fit(); |
(C++20 以降 constexpr) | |
未使用のキャパシティの削除を要求します。
capacity()をsize()に減らすための拘束力のない要求です。この要求が満たされるかどうかは、実装に依存します。
再割り当てが発生した場合、すべてのイテレータ(end()イテレータを含む)および要素へのすべての参照は無効になります。再割り当てが発生しなかった場合、イテレータも参照も無効になりません。
|
|
(C++11以降) |
目次 |
[編集] 複雑度
コンテナのサイズに対して最大で線形。
例外CopyInsertableでない |
(C++11以降) |
[編集] 注釈
libstdc++では、C++98モードではshrink_to_fit()は利用できません。
[編集] 例
このコードを実行
#include <iostream> #include <vector> int main() { std::vector<int> v; std::cout << "Default-constructed capacity is " << v.capacity() << '\n'; v.resize(100); std::cout << "Capacity of a 100-element vector is " << v.capacity() << '\n'; v.resize(50); std::cout << "Capacity after resize(50) is " << v.capacity() << '\n'; v.shrink_to_fit(); std::cout << "Capacity after shrink_to_fit() is " << v.capacity() << '\n'; v.clear(); std::cout << "Capacity after clear() is " << v.capacity() << '\n'; v.shrink_to_fit(); std::cout << "Capacity after shrink_to_fit() is " << v.capacity() << '\n'; for (int i = 1000; i < 1300; ++i) v.push_back(i); std::cout << "Capacity after adding 300 elements is " << v.capacity() << '\n'; v.shrink_to_fit(); std::cout << "Capacity after shrink_to_fit() is " << v.capacity() << '\n'; }
実行結果の例
Default-constructed capacity is 0 Capacity of a 100-element vector is 100 Capacity after resize(50) is 100 Capacity after shrink_to_fit() is 50 Capacity after clear() is 50 Capacity after shrink_to_fit() is 0 Capacity after adding 300 elements is 512 Capacity after shrink_to_fit() is 300
[編集] 欠陥レポート
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 755 | C++98 | std::vectorには明示的なshrink-to-fit操作が不足していた |
提供された |
| 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. 追加 |
[編集] 関連項目
| 要素数を返す (public メンバ関数) | |
| 現在確保されているストレージに保持できる要素数を返す (public member function) |