C++ <vector> clear 函数
clear 是 vector 中用于清空所有元素的函数,是最简单、最高效的清空容器方法。
clear 是容器类的成员函数,用于删除容器中的所有元素,使容器变为空。调用后,容器的 size() 将变为 0。
clear 是重置容器的标准方法,常用于需要重新开始或释放内存的场景。
单词释义: clear 表示"清除",即删除所有元素。
基本语法与参数
clear 是容器类的成员函数,调用它不需要任何参数。
语法格式
void clear();
参数说明
- 参数: 无参数
clear不接受任何参数。
函数说明
- 返回值:
void(无返回值)。 - 效果: 删除容器中的所有元素,
size()变为 0。capacity()通常保持不变(取决于具体实现)。 - 注意:
clear不会释放底层内存,容量保持不变。如果想同时释放内存,可以使用swap技术。
实例
让我们通过一系列例子,彻底掌握 clear 的用法。
示例 1:基础用法 - 清空容器
实例
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "清空前 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// 清空所有元素
numbers.clear();
std::cout << "清空后 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::cout << "清空前 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// 清空所有元素
numbers.clear();
std::cout << "清空后 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
return 0;
}
运行结果预期:
清空前 - size: 5, capacity: 5 清空后 - size: 0, capacity: 5
代码解析:
clear()将size()变为 0。capacity()保持不变,内存没有被释放。
示例 2:清空后重新添加元素
清空后的容器可以继续使用。
实例
#include <iostream>
#include <vector>
#include <string>
int main() {
std::vector<std::string> tasks;
// 添加任务
tasks.push_back("学习 C++");
tasks.push_back("完成作业");
tasks.push_back("阅读文档");
std::cout << "任务列表 (" << tasks.size() << " 项):" << std::endl;
for(const auto& t : tasks) {
std::cout << "- " << t << std::endl;
}
// 清空任务列表
tasks.clear();
std::cout << "\n清空后 (" << tasks.size() << " 项)" << std::endl;
// 可以继续添加新任务
tasks.push_back("新任务 A");
tasks.push_back("新任务 B");
std::cout << "\n重新添加后 (" << tasks.size() << " 项):" << std::endl;
for(const auto& t : tasks) {
std::cout << "- " << t << std::endl;
}
return 0;
}
#include <vector>
#include <string>
int main() {
std::vector<std::string> tasks;
// 添加任务
tasks.push_back("学习 C++");
tasks.push_back("完成作业");
tasks.push_back("阅读文档");
std::cout << "任务列表 (" << tasks.size() << " 项):" << std::endl;
for(const auto& t : tasks) {
std::cout << "- " << t << std::endl;
}
// 清空任务列表
tasks.clear();
std::cout << "\n清空后 (" << tasks.size() << " 项)" << std::endl;
// 可以继续添加新任务
tasks.push_back("新任务 A");
tasks.push_back("新任务 B");
std::cout << "\n重新添加后 (" << tasks.size() << " 项):" << std::endl;
for(const auto& t : tasks) {
std::cout << "- " << t << std::endl;
}
return 0;
}
运行结果预期:
任务列表 (3 项): - 学习 C++ - 完成作业 - 阅读文档 清空后 (0 项) 重新添加后 (2 项): - 新任务 A - 新任务 B
代码解析:
clear()清空后,容器可以继续使用。- 由于容量保持不变,重新添加元素时不需要重新分配内存。
示例 3:使用 empty() 检查清空状态
clear() 后,可以使用 empty() 检查容器是否为空。
实例
#include <iostream>
#include <vector>
void processData(std::vector<int>& data) {
std::cout << "处理数据中,当前有 " << data.size() << " 个元素..." << std::endl;
// 处理数据...
// 清理数据
data.clear();
std::cout << "数据已清空" << std::endl;
}
int main() {
std::vector<int> cache = {1, 2, 3, 4, 5};
// 模拟缓存使用
for(int i = 0; i < 3; ++i) {
cache.push_back(cache.size() + 1);
std::cout << "添加元素后 - size: " << cache.size()
<< ", empty: " << (cache.empty() ? "true" : "false") << std::endl;
}
// 清空缓存
cache.clear();
std::cout << "清空后 - empty: " << (cache.empty() ? "true" : "false") << std::endl;
return 0;
}
#include <vector>
void processData(std::vector<int>& data) {
std::cout << "处理数据中,当前有 " << data.size() << " 个元素..." << std::endl;
// 处理数据...
// 清理数据
data.clear();
std::cout << "数据已清空" << std::endl;
}
int main() {
std::vector<int> cache = {1, 2, 3, 4, 5};
// 模拟缓存使用
for(int i = 0; i < 3; ++i) {
cache.push_back(cache.size() + 1);
std::cout << "添加元素后 - size: " << cache.size()
<< ", empty: " << (cache.empty() ? "true" : "false") << std::endl;
}
// 清空缓存
cache.clear();
std::cout << "清空后 - empty: " << (cache.empty() ? "true" : "false") << std::endl;
return 0;
}
运行结果预期:
添加元素后 - size: 6, empty: false 添加元素后 - size: 7, empty: false 添加元素后 - size: 8, empty: false 清空后 - empty: true
代码解析:
empty()返回true当size() == 0时。clear()后,empty()返回true。
示例 4:彻底释放内存
如果想在清空元素的同时释放内存,可以使用 swap 技术。
实例
#include <iostream>
#include <vector>
int main() {
std::vector<int> numbers;
// 添加大量元素
for(int i = 0; i < 1000; ++i) {
numbers.push_back(i);
}
std::cout << "清空前 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// 方法1:只 clear(不释放内存)
numbers.clear();
std::cout << "clear() 后 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// 方法2:使用 swap 技巧(释放内存)
std::vector<int>().swap(numbers);
std::cout << "swap 后 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> numbers;
// 添加大量元素
for(int i = 0; i < 1000; ++i) {
numbers.push_back(i);
}
std::cout << "清空前 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// 方法1:只 clear(不释放内存)
numbers.clear();
std::cout << "clear() 后 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
// 方法2:使用 swap 技巧(释放内存)
std::vector<int>().swap(numbers);
std::cout << "swap 后 - size: " << numbers.size()
<< ", capacity: " << numbers.capacity() << std::endl;
return 0;
}
运行结果预期:
清空前 - size: 1000, capacity: 1000 clear() 后 - size: 0, capacity: 1000 swap 后 - size: 0, capacity: 0
代码解析:
clear()只清空元素,容量保持不变。std::vector创建一个临时空 vector 并与 numbers 交换,完全释放内存。().swap(numbers)
示例 5:在循环中使用 clear
可以在循环中使用 clear 来重置数据。
实例
#include <iostream>
#include <vector>
int main() {
std::vector<int> buffer;
buffer.reserve(100);
// 模拟多轮处理
for(int round = 1; round <= 3; ++round) {
// 填充数据
for(int i = 0; i < 10; ++i) {
buffer.push_back(round * 100 + i);
}
std::cout << "第 " << round << " 轮 - 处理数据: ";
for(int n : buffer) {
std::cout << n << " ";
}
std::cout << std::endl;
// 处理完后清空,准备下一轮
buffer.clear();
}
std::cout << "所有轮次完成,最终 buffer 大小: " << buffer.size() << std::endl;
return 0;
}
#include <vector>
int main() {
std::vector<int> buffer;
buffer.reserve(100);
// 模拟多轮处理
for(int round = 1; round <= 3; ++round) {
// 填充数据
for(int i = 0; i < 10; ++i) {
buffer.push_back(round * 100 + i);
}
std::cout << "第 " << round << " 轮 - 处理数据: ";
for(int n : buffer) {
std::cout << n << " ";
}
std::cout << std::endl;
// 处理完后清空,准备下一轮
buffer.clear();
}
std::cout << "所有轮次完成,最终 buffer 大小: " << buffer.size() << std::endl;
return 0;
}
代码解析:
clear()可以在循环中用于重置缓冲区。- 配合
reserve使用,可以避免频繁的内存分配。

C++ 容器类 <vector>