| 函式 | 功能 | 回傳 | 時間複雜度 | 備註 |
|---|---|---|---|---|
size() | 取得目前元素個數 | size_type (無號整數) | O(1) | 不等於 capacity() |
clear() | 移除所有元素,大小歸零 | void | O(N) (呼叫解構函式) | 不釋放記憶體容量 (capacity() 不變) |
empty() | 判斷是否為空 | bool (true=空) | O(1) | 優於 size()==0 (語意更清晰) |
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector v;
for (int i = 0; i < 10; ++i) v.push_back(i); // 0~9
cout << "初始內容: ";
for (auto it = v.begin(); it != v.end(); ++it) cout << *it << ' ';
cout << '\n';
cout << "size() = " << v.size() << '\n'; // 10
cout << "empty() = " << v.empty() << '\n'; // 0 (false)
v.clear(); // 清空
cout << "clear() 後:\n";
cout << "size() = " << v.size() << '\n'; // 0
cout << "empty() = " << v.empty() << '\n'; // 1 (true)
cout << "capacity() = " << v.capacity() << '\n'; // 仍保留記憶體 (通常 10 或更多)
// 真正釋放記憶體 (C++11)
v.shrink_to_fit();
cout << "shrink_to_fit() 後 capacity = " << v.capacity() << '\n'; // 0
system("pause");
return 0;
}
size() vs capacity():size() 為有效元素數;capacity() 為已分配可容納元素數 (不重新分配)。reserve(n) 預留容量避免擴容拷貝。clear() 後迭代器、指標、引用 全部失效。empty() 是唯一標準判空方式,勿用 v.size() == 0 或 !v.size() (雖能編譯但語意較差)。std::erase_if(v, pred) 可條件清除。// 邊遍歷邊刪除 (需用 erase 回傳的新迭代器)
for (auto it = v.begin(); it != v.end(); ) {
if (ShouldRemove(*it)) it = v.erase(it);
else ++it;
}
// 批次清空並釋放記憶體
vector v;
v.clear();
v.shrink_to_fit(); // C++11, 非強制釋放,視實現而定
// 交換技巧 (C++98/03 釋放記憶體)
vector().swap(v); // v 變空且 capacity 歸零
size() 看大小,empty() 判空,clear() 清內容保容量。搭配 capacity()/reserve()/shrink_to_fit() 掌握記憶體節奏,配合 erase 迭代器慣用法,驕馭 vector 這把 C++ 容器瑞士刀。