现在位置: 首页 > C++ 教程 > 正文

C++ <vector> clear 函数

C++ 容器类 <vector> C++ 容器类 <vector>


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;
}

运行结果预期:

清空前 - size: 5, capacity: 5
清空后 - size: 0, capacity: 5

代码解析:

  1. clear()size() 变为 0。
  2. 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;
}

运行结果预期:

任务列表 (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;
}

运行结果预期:

添加元素后 - size: 6, empty: false
添加元素后 - size: 7, empty: false
添加元素后 - size: 8, empty: false
清空后 - empty: true

代码解析:

  • empty() 返回 truesize() == 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;
}

运行结果预期:

清空前 - size: 1000, capacity: 1000
clear() 后 - size: 0, capacity: 1000
swap 后 - size: 0, capacity: 0

代码解析:

  • clear() 只清空元素,容量保持不变。
  • std::vector().swap(numbers) 创建一个临时空 vector 并与 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;
}

代码解析:

  • clear() 可以在循环中用于重置缓冲区。
  • 配合 reserve 使用,可以避免频繁的内存分配。

C++ 容器类 <vector> C++ 容器类 <vector>