【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+)。
相关推荐
智者知已应修善业8 分钟前
【51单片机2个按键控制流水灯运行与暂停】2023-9-6
c++·经验分享·笔记·算法·51单片机
云泽8081 小时前
C++11 核心特性全解:列表初始化、右值引用与移动语义实战
开发语言·c++
AI进化营-智能译站2 小时前
ROS2 C++开发系列12-用多态与虚函数构建可扩展的ROS2机器人行为模块
开发语言·c++·ai·机器人
Morwit2 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
qeen873 小时前
【数据结构】建堆的时间复杂度讨论与TOP-K问题
c语言·数据结构·c++·学习·
图码3 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
handler013 小时前
Linux 内核剖析:进程优先级、上下文切换与 O(1) 调度算法
linux·运维·c语言·开发语言·c++·笔记·算法
zhouwy1133 小时前
Linux进程与线程编程详解
linux·c++
A7bert7774 小时前
【YOLOv8pose部署至RDK X5】模型训练→转换bin→Sunrise 5部署
c++·python·深度学习·yolo·目标检测
li1670902705 小时前
第二十七章:智能指针
c语言·数据结构·c++·visual studio