【std::vector】clear介绍

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

      • [`std::vector::clear()` 详细说明](#std::vector::clear() 详细说明)
        • [1. 核心功能](#1. 核心功能)
        • [2. 对 size 和 capacity 的具体影响](#2. 对 size 和 capacity 的具体影响)
        • [3. 代码示例](#3. 代码示例)
        • [4. 补充说明](#4. 补充说明)
      • 总结

你想了解C++标准库中std::vectorclear()成员函数的功能,并且重点关注这个函数是对size生效,还是对capacity生效。

std::vector::clear() 详细说明

1. 核心功能

clear()的作用是销毁vector中所有的元素 ,并将vector元素数量(size)置为 0 ,但不会释放 vector 已经分配的内存空间(即不改变容量 capacity)。

2. 对 size 和 capacity 的具体影响
  • 对 size 的影响clear() 会直接将 vectorsize() 返回值变为 0,因为容器内的所有元素都被销毁了,当前有效元素的数量为 0。
  • 对 capacity 的影响clear() 完全不影响 capacity() 的返回值,容器之前分配的内存空间会被保留,不会被释放。
3. 代码示例

下面的代码可以直观展示 clear()sizecapacity 的影响:

cpp 复制代码
#include <iostream>
#include <vector>

int main() {
    // 创建一个vector并添加元素
    std::vector<int> vec = {1, 2, 3, 4, 5};
    
    std::cout << "调用clear()前:" << std::endl;
    std::cout << "size: " << vec.size() << std::endl;     // 输出 5(当前元素数量)
    std::cout << "capacity: " << vec.capacity() << std::endl; // 输出 5(分配的内存能容纳的元素数)

    // 调用clear()清空元素
    vec.clear();

    std::cout << "\n调用clear()后:" << std::endl;
    std::cout << "size: " << vec.size() << std::endl;     // 输出 0(元素已清空)
    std::cout << "capacity: " << vec.capacity() << std::endl; // 输出 5(内存仍保留)

    // 补充:如果想同时清空元素并释放内存(改变capacity),可以用swap技巧
    std::vector<int>().swap(vec); // 用空vector交换,释放原有内存
    std::cout << "\nswap后:" << std::endl;
    std::cout << "size: " << vec.size() << std::endl;     // 输出 0
    std::cout << "capacity: " << vec.capacity() << std::endl; // 输出 0(内存已释放)

    return 0;
}
4. 补充说明
  • clear() 只是销毁元素,不会调用 deallocate 释放内存,这样做的目的是为了性能优化:如果后续需要向 vector 中添加新元素,不需要重新分配内存,直接复用原有空间即可。
  • 如果你既想清空元素,又想释放内存(让 capacity 也变为 0),可以使用示例中的 swap 技巧,或者在 C++11 及以上版本中使用 shrink_to_fit()(注意:shrink_to_fit() 是请求式的,编译器不一定会严格执行,但主流编译器都会支持)。

总结

  1. std::vector::clear() 仅对 size 生效,会将 size 置为 0,销毁所有元素;
  2. clear()capacity 无影响,不会释放已分配的内存空间;
  3. 若需清空元素并释放内存,可使用 swapvectorshrink_to_fit()(C++11+)。
相关推荐
哥不想学算法2 小时前
【C++】字符串字面量拼接
开发语言·c++
cookies_s_s8 小时前
C++ 字符串动态创建对象 -- 工厂模式、自动注册、模板递归动态调用
服务器·开发语言·c++
王老师青少年编程8 小时前
2026年6月GESP真题及题解(C++七级):消消乐
数据结构·c++·算法·真题·gesp·2026年6月
海清河晏1118 小时前
数据结构 | 二叉搜索树
数据结构·c++·visual studio
盐焗鹌鹑蛋9 小时前
【C++】继承
开发语言·c++
会周易的程序员9 小时前
使用 pybind11 封装 C++ 日志库 microLog 为 Python 模块
java·c++·python·物联网·架构·日志·aiot
WZF-Sang9 小时前
网络基础——2
服务器·网络·c++·学习·网络编程·php
-西门吹雪11 小时前
现代C++ 并发编程-学习指南
java·jvm·c++
没头脑的男大11 小时前
CMake学习教学
linux·c++·学习
aaPIXa62213 小时前
C++ TensorRT Edge-LLM 边缘推理框架:从原理到实战
开发语言·c++·edge